@transcend-io/cli 7.0.0-alpha.12 → 7.0.0-alpha.13

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 (273) 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-24SSWBXM.js +4 -0
  8. package/dist/chunk-24SSWBXM.js.map +1 -0
  9. package/dist/chunk-347UQP43.js +2 -0
  10. package/dist/chunk-347UQP43.js.map +1 -0
  11. package/dist/chunk-43JWXG77.js +2 -0
  12. package/dist/chunk-43JWXG77.js.map +1 -0
  13. package/dist/chunk-4GLITB3Y.js +2 -0
  14. package/dist/chunk-4GLITB3Y.js.map +1 -0
  15. package/dist/chunk-6P4FW6XR.js +3 -0
  16. package/dist/chunk-6P4FW6XR.js.map +1 -0
  17. package/dist/chunk-72U6ETHG.js +2 -0
  18. package/dist/chunk-72U6ETHG.js.map +1 -0
  19. package/dist/chunk-7QHA6ZIV.js +2 -0
  20. package/dist/chunk-7QHA6ZIV.js.map +1 -0
  21. package/dist/chunk-ARVEJERC.js +2 -0
  22. package/dist/chunk-ARVEJERC.js.map +1 -0
  23. package/dist/chunk-CBAHSBSW.js +2 -0
  24. package/dist/chunk-CBAHSBSW.js.map +1 -0
  25. package/dist/chunk-HH2PQ3PQ.js +2 -0
  26. package/dist/chunk-HH2PQ3PQ.js.map +1 -0
  27. package/dist/chunk-INLBXSQE.js +9 -0
  28. package/dist/chunk-INLBXSQE.js.map +1 -0
  29. package/dist/chunk-KRN6Q433.js +75 -0
  30. package/dist/chunk-KRN6Q433.js.map +1 -0
  31. package/dist/chunk-L5ULN3IT.js +2 -0
  32. package/dist/chunk-L5ULN3IT.js.map +1 -0
  33. package/dist/chunk-L7ZIX4SU.js +2 -0
  34. package/dist/chunk-L7ZIX4SU.js.map +1 -0
  35. package/dist/chunk-LAYHULHH.js +2 -0
  36. package/dist/chunk-LAYHULHH.js.map +1 -0
  37. package/dist/chunk-MA4JWWRO.js +6 -0
  38. package/dist/chunk-MA4JWWRO.js.map +1 -0
  39. package/dist/chunk-MVDOKJ6J.js +2 -0
  40. package/dist/chunk-MVDOKJ6J.js.map +1 -0
  41. package/dist/chunk-OEB7WG3G.js +4 -0
  42. package/dist/chunk-OEB7WG3G.js.map +1 -0
  43. package/dist/chunk-SF46ZLPT.js +2 -0
  44. package/dist/chunk-SF46ZLPT.js.map +1 -0
  45. package/dist/chunk-TDBKATQK.js +2831 -0
  46. package/dist/chunk-TDBKATQK.js.map +1 -0
  47. package/dist/chunk-WSDWILYI.js +2 -0
  48. package/dist/chunk-WSDWILYI.js.map +1 -0
  49. package/dist/chunk-XNR74SBS.js +12 -0
  50. package/dist/chunk-XNR74SBS.js.map +1 -0
  51. package/dist/chunk-ZLRUIEVQ.js +94 -0
  52. package/dist/chunk-ZLRUIEVQ.js.map +1 -0
  53. package/dist/chunk-ZTD7APNF.js +2 -0
  54. package/dist/chunk-ZTD7APNF.js.map +1 -0
  55. package/dist/impl-25VWUB6L.js +2 -0
  56. package/dist/impl-25VWUB6L.js.map +1 -0
  57. package/dist/impl-3M5R6G5M.js +6 -0
  58. package/dist/impl-3M5R6G5M.js.map +1 -0
  59. package/dist/impl-5OEPVWPL.js +2 -0
  60. package/dist/impl-5OEPVWPL.js.map +1 -0
  61. package/dist/impl-5YV7K446.js +2 -0
  62. package/dist/impl-5YV7K446.js.map +1 -0
  63. package/dist/impl-AFRHPZGF.js +2 -0
  64. package/dist/impl-AFRHPZGF.js.map +1 -0
  65. package/dist/impl-CCUCFOCW.js +6 -0
  66. package/dist/impl-CCUCFOCW.js.map +1 -0
  67. package/dist/impl-E36SWF4Z.js +2 -0
  68. package/dist/impl-E36SWF4Z.js.map +1 -0
  69. package/dist/impl-E5WXNV47.js +2 -0
  70. package/dist/impl-E5WXNV47.js.map +1 -0
  71. package/dist/impl-EVICJMI3.js +2 -0
  72. package/dist/impl-EVICJMI3.js.map +1 -0
  73. package/dist/impl-G5TGSB4H.js +2 -0
  74. package/dist/impl-G5TGSB4H.js.map +1 -0
  75. package/dist/impl-GNG2DOKG.js +2 -0
  76. package/dist/impl-GNG2DOKG.js.map +1 -0
  77. package/dist/impl-GNSHZ3OL.js +2 -0
  78. package/dist/impl-GNSHZ3OL.js.map +1 -0
  79. package/dist/impl-GPCURY4M.js +7 -0
  80. package/dist/impl-GPCURY4M.js.map +1 -0
  81. package/dist/impl-GZRQOFY6.js +2 -0
  82. package/dist/impl-GZRQOFY6.js.map +1 -0
  83. package/dist/impl-HEC3SVYP.js +2 -0
  84. package/dist/impl-HEC3SVYP.js.map +1 -0
  85. package/dist/impl-HH24GIMG.js +2 -0
  86. package/dist/impl-HH24GIMG.js.map +1 -0
  87. package/dist/impl-I24OLEN5.js +2 -0
  88. package/dist/impl-I24OLEN5.js.map +1 -0
  89. package/dist/impl-IAXNYDJT.js +2 -0
  90. package/dist/impl-IAXNYDJT.js.map +1 -0
  91. package/dist/impl-J33PI3PK.js +2 -0
  92. package/dist/impl-J33PI3PK.js.map +1 -0
  93. package/dist/impl-JZDUGI7W.js +2 -0
  94. package/dist/impl-JZDUGI7W.js.map +1 -0
  95. package/dist/impl-LZ3HI26W.js +4 -0
  96. package/dist/impl-LZ3HI26W.js.map +1 -0
  97. package/dist/impl-MEDPDKAE.js +2 -0
  98. package/dist/impl-MEDPDKAE.js.map +1 -0
  99. package/dist/impl-MLS6TI7N.js +2 -0
  100. package/dist/impl-MLS6TI7N.js.map +1 -0
  101. package/dist/impl-NI7KSBSS.js +2 -0
  102. package/dist/impl-NI7KSBSS.js.map +1 -0
  103. package/dist/impl-OM6EKANE.js +9 -0
  104. package/dist/impl-OM6EKANE.js.map +1 -0
  105. package/dist/impl-T4WDJSWZ.js +2 -0
  106. package/dist/impl-T4WDJSWZ.js.map +1 -0
  107. package/dist/impl-U37YTCPW.js +2 -0
  108. package/dist/impl-U37YTCPW.js.map +1 -0
  109. package/dist/impl-U5555HGJ.js +12 -0
  110. package/dist/impl-U5555HGJ.js.map +1 -0
  111. package/dist/impl-UHFSVVIS.js +6 -0
  112. package/dist/impl-UHFSVVIS.js.map +1 -0
  113. package/dist/impl-UIVTSO57.js +2 -0
  114. package/dist/impl-UIVTSO57.js.map +1 -0
  115. package/dist/impl-UQYL5PXR.js +2 -0
  116. package/dist/impl-UQYL5PXR.js.map +1 -0
  117. package/dist/impl-V5QTKTU4.js +2 -0
  118. package/dist/impl-V5QTKTU4.js.map +1 -0
  119. package/dist/impl-WDPWOOFV.js +2 -0
  120. package/dist/impl-WDPWOOFV.js.map +1 -0
  121. package/dist/impl-WZAF2LD3.js +2 -0
  122. package/dist/impl-WZAF2LD3.js.map +1 -0
  123. package/dist/impl-XF26H3HG.js +2 -0
  124. package/dist/impl-XF26H3HG.js.map +1 -0
  125. package/dist/impl-XQY2Q5R6.js +2 -0
  126. package/dist/impl-XQY2Q5R6.js.map +1 -0
  127. package/dist/impl-YB2LON7S.js +2 -0
  128. package/dist/impl-YB2LON7S.js.map +1 -0
  129. package/dist/impl-YNGQIWW7.js +2 -0
  130. package/dist/impl-YNGQIWW7.js.map +1 -0
  131. package/dist/impl-ZA3PKNQN.js +2 -0
  132. package/dist/impl-ZA3PKNQN.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 -46
  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-BRVWR44K.cjs +0 -2
  144. package/dist/chunk-BRVWR44K.cjs.map +0 -1
  145. package/dist/chunk-BY7W4UQF.cjs +0 -2
  146. package/dist/chunk-BY7W4UQF.cjs.map +0 -1
  147. package/dist/chunk-CX2GRUPB.cjs +0 -2
  148. package/dist/chunk-CX2GRUPB.cjs.map +0 -1
  149. package/dist/chunk-DQHCGJTR.cjs +0 -2
  150. package/dist/chunk-DQHCGJTR.cjs.map +0 -1
  151. package/dist/chunk-EG4L6YAJ.cjs +0 -2
  152. package/dist/chunk-EG4L6YAJ.cjs.map +0 -1
  153. package/dist/chunk-IBTP5OXE.cjs +0 -2
  154. package/dist/chunk-IBTP5OXE.cjs.map +0 -1
  155. package/dist/chunk-JC7VDPVP.cjs +0 -2831
  156. package/dist/chunk-JC7VDPVP.cjs.map +0 -1
  157. package/dist/chunk-KAE73AXX.cjs +0 -2
  158. package/dist/chunk-KAE73AXX.cjs.map +0 -1
  159. package/dist/chunk-KEXUFX2J.cjs +0 -12
  160. package/dist/chunk-KEXUFX2J.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-LOOIAAAW.cjs +0 -9
  164. package/dist/chunk-LOOIAAAW.cjs.map +0 -1
  165. package/dist/chunk-OKOJP5XU.cjs +0 -94
  166. package/dist/chunk-OKOJP5XU.cjs.map +0 -1
  167. package/dist/chunk-ORNBWSZL.cjs +0 -2
  168. package/dist/chunk-ORNBWSZL.cjs.map +0 -1
  169. package/dist/chunk-QJYHSHFA.cjs +0 -2
  170. package/dist/chunk-QJYHSHFA.cjs.map +0 -1
  171. package/dist/chunk-SAEKBZGF.cjs +0 -2
  172. package/dist/chunk-SAEKBZGF.cjs.map +0 -1
  173. package/dist/chunk-T462ONFX.cjs +0 -2
  174. package/dist/chunk-T462ONFX.cjs.map +0 -1
  175. package/dist/chunk-TD7ADMVO.cjs +0 -2
  176. package/dist/chunk-TD7ADMVO.cjs.map +0 -1
  177. package/dist/chunk-UEGX6GZ2.cjs +0 -2
  178. package/dist/chunk-UEGX6GZ2.cjs.map +0 -1
  179. package/dist/chunk-URT6VVOK.cjs +0 -3
  180. package/dist/chunk-URT6VVOK.cjs.map +0 -1
  181. package/dist/chunk-UYYOVK3W.cjs +0 -2
  182. package/dist/chunk-UYYOVK3W.cjs.map +0 -1
  183. package/dist/chunk-X4YTPQVY.cjs +0 -4
  184. package/dist/chunk-X4YTPQVY.cjs.map +0 -1
  185. package/dist/chunk-ZJDLK7C3.cjs +0 -75
  186. package/dist/chunk-ZJDLK7C3.cjs.map +0 -1
  187. package/dist/chunk-ZUNVPK23.cjs +0 -2
  188. package/dist/chunk-ZUNVPK23.cjs.map +0 -1
  189. package/dist/chunk-ZVK4HIDF.cjs +0 -6
  190. package/dist/chunk-ZVK4HIDF.cjs.map +0 -1
  191. package/dist/impl-2DZ5OV74.cjs +0 -2
  192. package/dist/impl-2DZ5OV74.cjs.map +0 -1
  193. package/dist/impl-2ILRPUCC.cjs +0 -9
  194. package/dist/impl-2ILRPUCC.cjs.map +0 -1
  195. package/dist/impl-2LBSGBBL.cjs +0 -2
  196. package/dist/impl-2LBSGBBL.cjs.map +0 -1
  197. package/dist/impl-3NMEM4QJ.cjs +0 -2
  198. package/dist/impl-3NMEM4QJ.cjs.map +0 -1
  199. package/dist/impl-3QGL5KFO.cjs +0 -2
  200. package/dist/impl-3QGL5KFO.cjs.map +0 -1
  201. package/dist/impl-56MNYVA5.cjs +0 -2
  202. package/dist/impl-56MNYVA5.cjs.map +0 -1
  203. package/dist/impl-6PKXIPAW.cjs +0 -2
  204. package/dist/impl-6PKXIPAW.cjs.map +0 -1
  205. package/dist/impl-73JOMLRW.cjs +0 -2
  206. package/dist/impl-73JOMLRW.cjs.map +0 -1
  207. package/dist/impl-ADTYWN4O.cjs +0 -2
  208. package/dist/impl-ADTYWN4O.cjs.map +0 -1
  209. package/dist/impl-BOLY4EOP.cjs +0 -7
  210. package/dist/impl-BOLY4EOP.cjs.map +0 -1
  211. package/dist/impl-DUSKH5V5.cjs +0 -2
  212. package/dist/impl-DUSKH5V5.cjs.map +0 -1
  213. package/dist/impl-F6IWO7FD.cjs +0 -2
  214. package/dist/impl-F6IWO7FD.cjs.map +0 -1
  215. package/dist/impl-GHDROQMO.cjs +0 -2
  216. package/dist/impl-GHDROQMO.cjs.map +0 -1
  217. package/dist/impl-HEJP2URY.cjs +0 -2
  218. package/dist/impl-HEJP2URY.cjs.map +0 -1
  219. package/dist/impl-IQ7A5Z4D.cjs +0 -6
  220. package/dist/impl-IQ7A5Z4D.cjs.map +0 -1
  221. package/dist/impl-JAJVO3ZW.cjs +0 -2
  222. package/dist/impl-JAJVO3ZW.cjs.map +0 -1
  223. package/dist/impl-JF27LEV3.cjs +0 -2
  224. package/dist/impl-JF27LEV3.cjs.map +0 -1
  225. package/dist/impl-JODNLRWN.cjs +0 -6
  226. package/dist/impl-JODNLRWN.cjs.map +0 -1
  227. package/dist/impl-KJUS5YHL.cjs +0 -6
  228. package/dist/impl-KJUS5YHL.cjs.map +0 -1
  229. package/dist/impl-KOKG6ZNB.cjs +0 -2
  230. package/dist/impl-KOKG6ZNB.cjs.map +0 -1
  231. package/dist/impl-KWJ7DKLD.cjs +0 -2
  232. package/dist/impl-KWJ7DKLD.cjs.map +0 -1
  233. package/dist/impl-LNCNTGHP.cjs +0 -2
  234. package/dist/impl-LNCNTGHP.cjs.map +0 -1
  235. package/dist/impl-MHS2Q5XQ.cjs +0 -2
  236. package/dist/impl-MHS2Q5XQ.cjs.map +0 -1
  237. package/dist/impl-MUMMGTPH.cjs +0 -2
  238. package/dist/impl-MUMMGTPH.cjs.map +0 -1
  239. package/dist/impl-NJ7B53DT.cjs +0 -2
  240. package/dist/impl-NJ7B53DT.cjs.map +0 -1
  241. package/dist/impl-OKINLHAG.cjs +0 -2
  242. package/dist/impl-OKINLHAG.cjs.map +0 -1
  243. package/dist/impl-PAGIGWUU.cjs +0 -2
  244. package/dist/impl-PAGIGWUU.cjs.map +0 -1
  245. package/dist/impl-PKVWUYYX.cjs +0 -2
  246. package/dist/impl-PKVWUYYX.cjs.map +0 -1
  247. package/dist/impl-QBPIYO6K.cjs +0 -2
  248. package/dist/impl-QBPIYO6K.cjs.map +0 -1
  249. package/dist/impl-QUC5AKPQ.cjs +0 -2
  250. package/dist/impl-QUC5AKPQ.cjs.map +0 -1
  251. package/dist/impl-RMVV72AB.cjs +0 -2
  252. package/dist/impl-RMVV72AB.cjs.map +0 -1
  253. package/dist/impl-S5EXF3MB.cjs +0 -2
  254. package/dist/impl-S5EXF3MB.cjs.map +0 -1
  255. package/dist/impl-SJGNXCXR.cjs +0 -4
  256. package/dist/impl-SJGNXCXR.cjs.map +0 -1
  257. package/dist/impl-SYM6RYJP.cjs +0 -2
  258. package/dist/impl-SYM6RYJP.cjs.map +0 -1
  259. package/dist/impl-UTZGKHAD.cjs +0 -2
  260. package/dist/impl-UTZGKHAD.cjs.map +0 -1
  261. package/dist/impl-VI3JMHFN.cjs +0 -2
  262. package/dist/impl-VI3JMHFN.cjs.map +0 -1
  263. package/dist/impl-VIX7AWHA.cjs +0 -2
  264. package/dist/impl-VIX7AWHA.cjs.map +0 -1
  265. package/dist/impl-W42Y6L6N.cjs +0 -2
  266. package/dist/impl-W42Y6L6N.cjs.map +0 -1
  267. package/dist/impl-XE5EV5SW.cjs +0 -12
  268. package/dist/impl-XE5EV5SW.cjs.map +0 -1
  269. package/dist/index.cjs +0 -5
  270. package/dist/index.cjs.map +0 -1
  271. /package/dist/bin/{bash-complete.d.cts → bash-complete.d.ts} +0 -0
  272. /package/dist/bin/{cli.d.cts → cli.d.ts} +0 -0
  273. /package/dist/bin/{deprecated-command.d.cts → deprecated-command.d.ts} +0 -0
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import{a as s}from"../chunk-72U6ETHG.js";import{a as o}from"../chunk-ZLRUIEVQ.js";import"../chunk-INLBXSQE.js";import"../chunk-L5ULN3IT.js";import"../chunk-SF46ZLPT.js";import"../chunk-ARVEJERC.js";import{proposeCompletions as r}from"@stricli/core";var t=process.argv.slice(3);process.env.COMP_LINE?.endsWith(" ")&&t.push("");await r(o,t,s(process));try{for(let{completion:p}of await r(o,t,s(process)))process.stdout.write(`${p}
3
+ `)}catch{}
4
+ //# sourceMappingURL=bash-complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/bin/bash-complete.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { proposeCompletions } from '@stricli/core';\nimport { app } from '../app';\nimport { buildContext } from '../context';\n\nconst inputs = process.argv.slice(3);\nif (process.env.COMP_LINE?.endsWith(' ')) {\n inputs.push('');\n}\nawait proposeCompletions(app, inputs, buildContext(process));\ntry {\n for (const { completion } of await proposeCompletions(\n app,\n inputs,\n buildContext(process),\n )) {\n process.stdout.write(`${completion}\\n`);\n }\n} catch {\n // ignore\n}\n"],"mappings":";sMACA,OAAS,sBAAAA,MAA0B,gBAInC,IAAMC,EAAS,QAAQ,KAAK,MAAM,CAAC,EAC/B,QAAQ,IAAI,WAAW,SAAS,GAAG,GACrCA,EAAO,KAAK,EAAE,EAEhB,MAAMC,EAAmBC,EAAKF,EAAQG,EAAa,OAAO,CAAC,EAC3D,GAAI,CACF,OAAW,CAAE,WAAAC,CAAW,IAAK,MAAMH,EACjCC,EACAF,EACAG,EAAa,OAAO,CACtB,EACE,QAAQ,OAAO,MAAM,GAAGC,CAAU;AAAA,CAAI,CAE1C,MAAQ,CAER","names":["proposeCompletions","inputs","proposeCompletions","app","buildContext","completion"]}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import{a as o}from"../chunk-72U6ETHG.js";import{a as r}from"../chunk-ZLRUIEVQ.js";import"../chunk-INLBXSQE.js";import"../chunk-L5ULN3IT.js";import"../chunk-SF46ZLPT.js";import"../chunk-ARVEJERC.js";import{run as i}from"@stricli/core";await i(r,process.argv.slice(2),o(process));
3
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { run } from '@stricli/core';\nimport { app } from '../app';\nimport { buildContext } from '../context';\n\nawait run(app, process.argv.slice(2), buildContext(process));\n"],"mappings":";sMACA,OAAS,OAAAA,MAAW,gBAIpB,MAAMC,EAAIC,EAAK,QAAQ,KAAK,MAAM,CAAC,EAAGC,EAAa,OAAO,CAAC","names":["run","run","app","buildContext"]}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import{a as n}from"../chunk-ZLRUIEVQ.js";import"../chunk-INLBXSQE.js";import{a as r}from"../chunk-43JWXG77.js";import"../chunk-L5ULN3IT.js";import"../chunk-SF46ZLPT.js";import"../chunk-ARVEJERC.js";import{generateHelpTextForAllCommands as c}from"@stricli/core";var s={"tr-build-xdi-sync-endpoint":["consent","build-xdi-sync-endpoint"],"tr-consent-manager-service-json-to-yml":["inventory","consent-manager-service-json-to-yml"],"tr-consent-managers-to-business-entities":["inventory","consent-managers-to-business-entities"],"tr-cron-mark-identifiers-completed":["request","cron","mark-identifiers-completed"],"tr-cron-pull-identifiers":["request","cron","pull-identifiers"],"tr-derive-data-silos-from-data-flows":["inventory","derive-data-silos-from-data-flows"],"tr-derive-data-silos-from-data-flows-cross-instance":["inventory","derive-data-silos-from-data-flows-cross-instance"],"tr-discover-silos":["inventory","discover-silos"],"tr-generate-api-keys":["admin","generate-api-keys"],"tr-manual-enrichment-pull-identifiers":["request","preflight","pull-identifiers"],"tr-manual-enrichment-push-identifiers":["request","preflight","push-identifiers"],"tr-mark-request-data-silos-completed":["request","system","mark-request-data-silos-completed"],"tr-pull":["inventory","pull"],"tr-pull-consent-metrics":["consent","pull-consent-metrics"],"tr-pull-consent-preferences":["consent","pull-consent-preferences"],"tr-pull-datapoints":["inventory","pull-datapoints"],"tr-pull-pull-unstructured-discovery-files":["inventory","pull-unstructured-discovery-files"],"tr-push":["inventory","push"],"tr-request-approve":["request","approve"],"tr-request-cancel":["request","cancel"],"tr-request-download-files":["request","download-files"],"tr-request-enricher-restart":["request","enricher-restart"],"tr-request-export":["request","export"],"tr-request-mark-silent":["request","mark-silent"],"tr-request-notify-additional-time":["request","notify-additional-time"],"tr-request-reject-unverified-identifiers":["request","reject-unverified-identifiers"],"tr-request-restart":["request","restart"],"tr-request-upload":["request","upload"],"tr-retry-request-data-silos":["request","system","retry-request-data-silos"],"tr-scan-packages":["inventory","scan-packages"],"tr-skip-preflight-jobs":["request","skip-preflight-jobs"],"tr-skip-request-data-silos":["request","system","skip-request-data-silos"],"tr-sync-ot":["migration","sync-ot"],"tr-update-consent-manager":["consent","update-consent-manager"],"tr-upload-consent-preferences":["consent","upload-consent-preferences"],"tr-upload-cookies-from-csv":["consent","upload-cookies-from-csv"],"tr-upload-data-flows-from-csv":["consent","upload-data-flows-from-csv"],"tr-upload-preferences":["consent","upload-preferences"]};function m(t){return c(n).find(o=>o[0]===`${n.config.name} ${t.join(" ")}`)?.[1]}function i(t){r.log("[DEPRECATION NOTICE]");let e=s[t];if(!e){let a=Object.entries(s).map(([d,l])=>`\`${d}\` -> \`${n.config.name} ${l.join(" ")}\``).join(`
3
+ `);r.log(`This command is deprecated as of v7.0.0. Here is a list of new commands, mapped to their legacy command names:
4
+ ${a}`);return}r.log(`\`${t}\` is deprecated as of v7.0.0.
5
+ Use \`${n.config.name} ${e.join(" ")}\` instead.
6
+ `);let o=m(e);if(!o)throw new Error(`Failed to get help text for command: \`${e.join(" ")}\``);r.log(o)}function p(){let e=process.argv.at(-1)?.split("/").pop()?.trim();if(e)i(e);else throw new Error("Deprecated command");process.exit(1)}p();
7
+ //# sourceMappingURL=deprecated-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/legacy-commands.ts","../../src/bin/deprecated-command.ts"],"sourcesContent":["import {\n generateHelpTextForAllCommands,\n type Application,\n type CommandContext,\n} from '@stricli/core';\nimport { app } from '../app';\nimport { logger } from '@/logger';\n\n// Maps legacy (<7.0.0) command names to their modern command structure\nexport const legacyCommandToModernCommandMap: Record<string, string[]> = {\n 'tr-build-xdi-sync-endpoint': ['consent', 'build-xdi-sync-endpoint'],\n 'tr-consent-manager-service-json-to-yml': [\n 'inventory',\n 'consent-manager-service-json-to-yml',\n ],\n 'tr-consent-managers-to-business-entities': [\n 'inventory',\n 'consent-managers-to-business-entities',\n ],\n 'tr-cron-mark-identifiers-completed': [\n 'request',\n 'cron',\n 'mark-identifiers-completed',\n ],\n 'tr-cron-pull-identifiers': ['request', 'cron', 'pull-identifiers'],\n 'tr-derive-data-silos-from-data-flows': [\n 'inventory',\n 'derive-data-silos-from-data-flows',\n ],\n 'tr-derive-data-silos-from-data-flows-cross-instance': [\n 'inventory',\n 'derive-data-silos-from-data-flows-cross-instance',\n ],\n 'tr-discover-silos': ['inventory', 'discover-silos'],\n 'tr-generate-api-keys': ['admin', 'generate-api-keys'],\n 'tr-manual-enrichment-pull-identifiers': [\n 'request',\n 'preflight',\n 'pull-identifiers',\n ],\n 'tr-manual-enrichment-push-identifiers': [\n 'request',\n 'preflight',\n 'push-identifiers',\n ],\n 'tr-mark-request-data-silos-completed': [\n 'request',\n 'system',\n 'mark-request-data-silos-completed',\n ],\n 'tr-pull': ['inventory', 'pull'],\n 'tr-pull-consent-metrics': ['consent', 'pull-consent-metrics'],\n 'tr-pull-consent-preferences': ['consent', 'pull-consent-preferences'],\n 'tr-pull-datapoints': ['inventory', 'pull-datapoints'],\n 'tr-pull-pull-unstructured-discovery-files': [\n 'inventory',\n 'pull-unstructured-discovery-files',\n ],\n 'tr-push': ['inventory', 'push'],\n 'tr-request-approve': ['request', 'approve'],\n 'tr-request-cancel': ['request', 'cancel'],\n 'tr-request-download-files': ['request', 'download-files'],\n 'tr-request-enricher-restart': ['request', 'enricher-restart'],\n 'tr-request-export': ['request', 'export'],\n 'tr-request-mark-silent': ['request', 'mark-silent'],\n 'tr-request-notify-additional-time': ['request', 'notify-additional-time'],\n 'tr-request-reject-unverified-identifiers': [\n 'request',\n 'reject-unverified-identifiers',\n ],\n 'tr-request-restart': ['request', 'restart'],\n 'tr-request-upload': ['request', 'upload'],\n 'tr-retry-request-data-silos': [\n 'request',\n 'system',\n 'retry-request-data-silos',\n ],\n 'tr-scan-packages': ['inventory', 'scan-packages'],\n 'tr-skip-preflight-jobs': ['request', 'skip-preflight-jobs'],\n 'tr-skip-request-data-silos': [\n 'request',\n 'system',\n 'skip-request-data-silos',\n ],\n 'tr-sync-ot': ['migration', 'sync-ot'],\n 'tr-update-consent-manager': ['consent', 'update-consent-manager'],\n 'tr-upload-consent-preferences': ['consent', 'upload-consent-preferences'],\n 'tr-upload-cookies-from-csv': ['consent', 'upload-cookies-from-csv'],\n 'tr-upload-data-flows-from-csv': ['consent', 'upload-data-flows-from-csv'],\n 'tr-upload-preferences': ['consent', 'upload-preferences'],\n};\n\n// All commands have been migrated to the modern command structure\n\n/**\n * Gets the help text for a command\n *\n * @param command - The command to get help text for\n * @returns The help text for the command\n */\nexport function getHelpTextForCommand(command: string[]): string | undefined {\n const helpTextForAllCommands = generateHelpTextForAllCommands(\n app as Application<CommandContext>,\n );\n\n return helpTextForAllCommands.find(\n (x) => x[0] === `${app.config.name} ${command.join(' ')}`,\n )?.[1];\n}\n\n/**\n * Logs a modern command recommendation for a legacy command\n *\n * @param legacyCommand - The legacy command to log a modern command recommendation for\n * @example\n * logModernCommandRecommendation('tr-cron-mark-identifiers-completed');\n */\nexport function logModernCommandRecommendation(\n legacyCommand: keyof typeof legacyCommandToModernCommandMap,\n): void {\n logger.log('[DEPRECATION NOTICE]');\n\n const modernCommand = legacyCommandToModernCommandMap[legacyCommand];\n if (!modernCommand) {\n const modernCommandString = Object.entries(legacyCommandToModernCommandMap)\n .map(\n ([legacyCommand, modernCommand]) =>\n `\\`${legacyCommand}\\` -> \\`${app.config.name} ${modernCommand.join(\n ' ',\n )}\\``,\n )\n .join('\\n');\n logger.log(\n 'This command is deprecated as of v7.0.0.' +\n ` Here is a list of new commands, mapped to their legacy command names:\n${modernCommandString}`,\n );\n return;\n }\n\n logger.log(\n `\\`${legacyCommand}\\` is deprecated as of v7.0.0.\\nUse \\`${\n app.config.name\n } ${modernCommand.join(' ')}\\` instead.\\n`,\n );\n\n const helpText = getHelpTextForCommand(modernCommand);\n if (!helpText) {\n throw new Error(\n `Failed to get help text for command: \\`${modernCommand.join(' ')}\\``,\n );\n }\n\n logger.log(helpText);\n}\n","#!/usr/bin/env node\nimport { logModernCommandRecommendation } from '../cli/legacy-commands';\n\n/**\n * Runs when a deprecated command is called.\n */\nfunction main(): void {\n const command = process.argv.at(-1);\n const legacyCommand = command?.split('/').pop()?.trim();\n if (legacyCommand) {\n logModernCommandRecommendation(legacyCommand);\n } else {\n throw new Error('Deprecated command');\n }\n\n process.exit(1);\n}\n\nmain();\n"],"mappings":"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","names":["generateHelpTextForAllCommands","legacyCommandToModernCommandMap","getHelpTextForCommand","command","generateHelpTextForAllCommands","app","x","logModernCommandRecommendation","legacyCommand","logger","modernCommand","modernCommandString","helpText","main","legacyCommand","logModernCommandRecommendation"]}
@@ -0,0 +1,4 @@
1
+ import{c as u}from"./chunk-MVDOKJ6J.js";import{a as E}from"./chunk-43JWXG77.js";import{readFileSync as b}from"fs";import{findAllWithRegex as F}from"@transcend-io/type-utils";import{CodePackageType as w}from"@transcend-io/privacy-types";var N=/target ('|")(.*?)('|")/,O=/pod ('|")(.*?)('|")(, ('|")~> (.+?)('|")|)/,y={supportedFiles:["Podfile"],ignoreDirs:["Pods"],scanFunction:e=>{let n=b(e,"utf-8"),o=F({value:new RegExp(N,"g"),matches:["quote1","name","quote2"]},n),c=F({value:new RegExp(O,"g"),matches:["quote1","name","quote2","extra","quote3","version","quote4"]},n);return o.map((t,p)=>({name:t.name,type:w.CocoaPods,softwareDevelopmentKits:c.filter(r=>r.matchIndex>t.matchIndex&&(!o[p+1]||r.matchIndex<o[p+1].matchIndex)).map(r=>({name:r.name,version:r.version}))}))}};import{readFileSync as T}from"fs";import{findAllWithRegex as l}from"@transcend-io/type-utils";import{dirname as h}from"path";var K=/implementation( *)('|")(.+?):(.+?):(.+?|)('|")/,M=/apply plugin: *('|")(.+?)(:(.+?)|)('|")/,j=/implementation group:( *)('|")(.+?)('|"),( *)name:( *)('|")(.+?)('|"),( *)version:( *)('|")(.+?)('|")/,L=/applicationId( *)"(.+?)"/,S={supportedFiles:["build.gradle**"],ignoreDirs:["gradle-app.setting","gradle-wrapper.jar","gradle-wrapper.properties"],scanFunction:e=>{let n=T(e,"utf-8"),o=h(e),c=l({value:new RegExp(K,"g"),matches:["space","quote1","name","path","version","quote2"]},n),a=l({value:new RegExp(M,"g"),matches:["quote1","name","group","version","quote2"]},n),t=l({value:new RegExp(j,"g"),matches:["space1","quote1","group","quote2","space2","space3","quote3","name","quote4","space4","space5","quote5","version","quote6"]},n),p=l({value:new RegExp(L,"g"),matches:["space","name"]},n);if(p.length>1)throw new Error(`Expected only one applicationId per file: ${e}`);return[{name:p[0]?.name||o.split("/").pop(),softwareDevelopmentKits:[...c,...t,...a].map(r=>({name:r.name,version:r.version||void 0}))}]}};import{readFileSync as $}from"fs";import{dirname as J}from"path";var x={supportedFiles:["package.json"],ignoreDirs:["node_modules","serverless-build","lambda-build"],scanFunction:e=>{let n=$(e,"utf-8"),o=J(e),c=JSON.parse(n),{name:a,description:t,dependencies:p={},devDependencies:r={},optionalDependencies:i={}}=c;return[{name:a||o.split("/").pop(),description:t,softwareDevelopmentKits:[...Object.entries(p).map(([s,m])=>({name:s,version:typeof m=="string"?m:void 0})),...Object.entries(r).map(([s,m])=>({name:s,version:typeof m=="string"?m:void 0,isDevDependency:!0})),...Object.entries(i).map(([s,m])=>({name:s,version:typeof m=="string"?m:void 0}))]}]}};import{readFileSync as R}from"fs";import{findAllWithRegex as X}from"@transcend-io/type-utils";import{dirname as U,join as W}from"path";import{CodePackageType as Y}from"@transcend-io/privacy-types";var V=/(.+?)(=+)(.+)/,H=/name *= *('|")(.+?)('|")/,Q=/description *= *('|")(.+?)('|")/,P={supportedFiles:["requirements.txt"],ignoreDirs:["build","lib","lib64"],scanFunction:e=>{let n=R(e,"utf-8"),o=U(e),a=u(o).find(s=>s==="setup.py"),t=a?R(W(o,a),"utf-8"):void 0,p=t?(H.exec(t)||[])[2]:void 0,r=t?(Q.exec(t)||[])[2]:void 0,i=X({value:new RegExp(V,"g"),matches:["name","equals","version"]},n);return[{name:p||o.split("/").pop(),description:r||void 0,type:Y.RequirementsTxt,softwareDevelopmentKits:i.map(s=>({name:s.name,version:s.version}))}]}};import{readFileSync as G}from"fs";import{findAllWithRegex as z}from"@transcend-io/type-utils";import{dirname as B}from"path";import{CodePackageType as Z}from"@transcend-io/privacy-types";var ee=/gem *('|")(.+?)('|")(, *('|")(.+?)('|")|)/,ne=/spec\.name *= *('|")(.+?)('|")/,oe=/spec\.description *= *('|")(.+?)('|")/,te=/spec\.summary *= *('|")(.+?)('|")/,k={supportedFiles:["Gemfile"],ignoreDirs:["bin"],scanFunction:e=>{let n=G(e,"utf-8"),o=B(e),a=u(o).find(s=>s===".gemspec"),t=a?G(a,"utf-8"):void 0,p=t?(ne.exec(t)||[])[2]:void 0,r=t?(oe.exec(t)||te.exec(t)||[])[1]:void 0,i=z({value:new RegExp(ee,"g"),matches:["quote1","name","quote2","hasVersion","quote3","version","quote4"]},n);return[{name:p||o.split("/").pop(),description:r||void 0,type:Z.RequirementsTxt,softwareDevelopmentKits:i.map(s=>({name:s.name,version:s.version}))}]}};import{readFileSync as re}from"fs";import{CodePackageType as ie}from"@transcend-io/privacy-types";import se from"js-yaml";import{dirname as ae}from"path";function pe(e){return e.split(`
2
+ `).map(n=>{let o=n.indexOf("#");return o>-1&&!n.substring(0,o).includes('"')&&!n.substring(0,o).includes("'")?n.substring(0,o).trim():n}).filter(n=>n.length>0).join(`
3
+ `)}var v={supportedFiles:["pubspec.yml"],ignoreDirs:["build"],scanFunction:e=>{let n=ae(e),o=re(e,"utf-8"),{name:c,description:a,dev_dependencies:t={},dependencies:p={}}=se.load(pe(o));return[{name:c||n.split("/").pop(),description:a,type:ie.RequirementsTxt,softwareDevelopmentKits:[...Object.entries(p).map(([r,i])=>({name:r,version:typeof i=="string"?i:typeof i=="number"?i.toString():i?.sdk})),...Object.entries(t).map(([r,i])=>({name:r,version:typeof i=="string"?i:typeof i=="number"?i.toString():i?.sdk,isDevDependency:!0}))]}]}};import{readFileSync as ce}from"fs";import{dirname as me}from"path";var I={supportedFiles:["composer.json"],ignoreDirs:["vendor","node_modules","cache","build","dist"],scanFunction:e=>{let n=ce(e,"utf-8"),o=me(e),c=JSON.parse(n),{name:a,description:t,require:p={},"require-dev":r={}}=c;return[{name:a||o.split("/").pop(),description:t,softwareDevelopmentKits:[...Object.entries(p).map(([i,s])=>({name:i,version:typeof s=="string"?s:void 0})),...Object.entries(r).map(([i,s])=>({name:i,version:typeof s=="string"?s:void 0,isDevDependency:!0}))]}]}};import{readFileSync as de}from"fs";import{CodePackageType as ge}from"@transcend-io/privacy-types";import{decodeCodec as fe}from"@transcend-io/type-utils";import*as d from"io-ts";import{dirname as ue}from"path";var le=d.type({pins:d.array(d.type({identity:d.string,kind:d.string,location:d.string,state:d.type({revision:d.string,version:d.string})})),version:d.number}),D={supportedFiles:["Package.resolved"],ignoreDirs:[],scanFunction:e=>{let n=de(e,"utf-8"),o=fe(le,n);return[{name:ue(e).split("/").pop()||"",type:ge.CocoaPods,softwareDevelopmentKits:o.pins.map(c=>({name:c.identity,version:c.state.version}))}]}};import{CodePackageType as f}from"@transcend-io/privacy-types";var gn={cocoaPods:y,gradle:S,javascriptPackageJson:x,pythonRequirementsTxt:P,gemfile:k,pubspec:v,swift:D},_={[f.CocoaPods]:y,[f.Gradle]:S,[f.PackageJson]:x,[f.RequirementsTxt]:P,[f.Gemfile]:k,[f.Pubspec]:v,[f.ComposerJson]:I,[f.Swift]:D};import Ce from"fast-glob";import A from"colors";import{getEntries as Ee}from"@transcend-io/type-utils";async function Sn({scanPath:e,ignoreDirs:n=[],repositoryName:o}){return(await Promise.all(Ee(_).map(async([a,t])=>{let{ignoreDirs:p,supportedFiles:r,scanFunction:i}=t,s=[...n,...p].filter(m=>m.length>0);try{let m=await Ce(`${e}/**/${r.join("|")}`,{ignore:s.map(g=>`${e}/**/${g}`),unique:!0,onlyFiles:!0});E.info(A.magenta(`Scanning: ${m.length} files of type ${a}`));let C=m.map(g=>i(g).map(q=>({...q,relativePath:g.replace(`${e}/`,"")}))).flat();return E.info(A.green(`Found: ${C.length} packages and ${C.map(({softwareDevelopmentKits:g=[]})=>g).flat().length} sdks`)),C.map(g=>({...g,type:a,repositoryName:o}))}catch(m){throw new Error(`Error scanning globs ${r} with error: ${m}`)}}))).flat()}export{gn as a,Sn as b};
4
+ //# sourceMappingURL=chunk-24SSWBXM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/code-scanning/integrations/cocoaPods.ts","../src/lib/code-scanning/integrations/gradle.ts","../src/lib/code-scanning/integrations/javascriptPackageJson.ts","../src/lib/code-scanning/integrations/pythonRequirementsTxt.ts","../src/lib/code-scanning/integrations/gemfile.ts","../src/lib/code-scanning/integrations/pubspec.ts","../src/lib/code-scanning/integrations/composerJson.ts","../src/lib/code-scanning/integrations/swift.ts","../src/lib/code-scanning/constants.ts","../src/lib/code-scanning/findCodePackagesInFolder.ts"],"sourcesContent":["import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { CodePackageSdk } from '../../../codecs';\nimport { findAllWithRegex } from '@transcend-io/type-utils';\nimport { CodePackageType } from '@transcend-io/privacy-types';\n\nconst POD_TARGET_REGEX = /target ('|\")(.*?)('|\")/;\nconst POD_PACKAGE_REGEX = /pod ('|\")(.*?)('|\")(, ('|\")~> (.+?)('|\")|)/;\n\nexport const cocoaPods: CodeScanningConfig = {\n supportedFiles: ['Podfile'],\n ignoreDirs: ['Pods'],\n scanFunction: (filePath) => {\n const fileContents = readFileSync(filePath, 'utf-8');\n\n const targets = findAllWithRegex(\n {\n value: new RegExp(POD_TARGET_REGEX, 'g'),\n matches: ['quote1', 'name', 'quote2'],\n },\n fileContents,\n );\n const packages = findAllWithRegex(\n {\n value: new RegExp(POD_PACKAGE_REGEX, 'g'),\n matches: [\n 'quote1',\n 'name',\n 'quote2',\n 'extra',\n 'quote3',\n 'version',\n 'quote4',\n ],\n },\n fileContents,\n );\n\n const deps: CodePackageSdk[] = targets.map((target, ind) => ({\n name: target.name,\n type: CodePackageType.CocoaPods,\n softwareDevelopmentKits: packages\n .filter(\n (pkg) =>\n pkg.matchIndex > target.matchIndex &&\n (!targets[ind + 1] || pkg.matchIndex < targets[ind + 1].matchIndex),\n )\n .map((pkg) => ({\n name: pkg.name,\n version: pkg.version,\n })),\n }));\n\n return deps;\n },\n};\n","import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { findAllWithRegex } from '@transcend-io/type-utils';\nimport { dirname } from 'path';\n\nconst GRADLE_IMPLEMENTATION_REGEX =\n /implementation( *)('|\")(.+?):(.+?):(.+?|)('|\")/;\nconst GRADLE_PLUGIN_REGEX = /apply plugin: *('|\")(.+?)(:(.+?)|)('|\")/;\nconst GRADLE_IMPLEMENTATION_GROUP_REGEX =\n /implementation group:( *)('|\")(.+?)('|\"),( *)name:( *)('|\")(.+?)('|\"),( *)version:( *)('|\")(.+?)('|\")/;\nconst GRADLE_APPLICATION_NAME_REGEX = /applicationId( *)\"(.+?)\"/;\n\n/**\n * So far, there are three ways of defining dependencies that is supported\n * implementation group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.core', version: '3.28.0'\n * or\n * implementation 'com.google.firebase:firebase-analytics:18.0.0'\n * or\n * apply plugin: 'com.google.gms.google-services'\n *\n * single and double quotes are both recognized\n */\nexport const gradle: CodeScanningConfig = {\n supportedFiles: ['build.gradle**'],\n ignoreDirs: [\n 'gradle-app.setting',\n 'gradle-wrapper.jar',\n 'gradle-wrapper.properties',\n ],\n scanFunction: (filePath) => {\n const fileContents = readFileSync(filePath, 'utf-8');\n const directory = dirname(filePath);\n\n const targets = findAllWithRegex(\n {\n value: new RegExp(GRADLE_IMPLEMENTATION_REGEX, 'g'),\n matches: ['space', 'quote1', 'name', 'path', 'version', 'quote2'],\n },\n fileContents,\n );\n const targetPlugins = findAllWithRegex(\n {\n value: new RegExp(GRADLE_PLUGIN_REGEX, 'g'),\n matches: ['quote1', 'name', 'group', 'version', 'quote2'],\n },\n fileContents,\n );\n const targetGroups = findAllWithRegex(\n {\n value: new RegExp(GRADLE_IMPLEMENTATION_GROUP_REGEX, 'g'),\n matches: [\n 'space1',\n 'quote1',\n 'group',\n 'quote2',\n 'space2',\n 'space3',\n 'quote3',\n 'name',\n 'quote4',\n 'space4',\n 'space5',\n 'quote5',\n 'version',\n 'quote6',\n ],\n },\n fileContents,\n );\n const applications = findAllWithRegex(\n {\n value: new RegExp(GRADLE_APPLICATION_NAME_REGEX, 'g'),\n matches: ['space', 'name'],\n },\n fileContents,\n );\n if (applications.length > 1) {\n throw new Error(`Expected only one applicationId per file: ${filePath}`);\n }\n\n return [\n {\n name: applications[0]?.name || directory.split('/').pop()!,\n softwareDevelopmentKits: [\n ...targets,\n ...targetGroups,\n ...targetPlugins,\n ].map((target) => ({\n name: target.name,\n version: target.version || undefined,\n })),\n },\n ];\n },\n};\n","import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { CodePackageSdk } from '../../../codecs';\nimport { dirname } from 'path';\n\nexport const javascriptPackageJson: CodeScanningConfig = {\n supportedFiles: ['package.json'],\n ignoreDirs: ['node_modules', 'serverless-build', 'lambda-build'],\n scanFunction: (filePath) => {\n const file = readFileSync(filePath, 'utf-8');\n const directory = dirname(filePath);\n const asJson = JSON.parse(file);\n const {\n name,\n description,\n dependencies = {},\n devDependencies = {},\n optionalDependencies = {},\n } = asJson;\n return [\n {\n // name of the package\n name: name || directory.split('/').pop()!,\n description,\n softwareDevelopmentKits: [\n ...Object.entries(dependencies).map(\n ([name, version]): CodePackageSdk => ({\n name,\n version: typeof version === 'string' ? version : undefined,\n }),\n ),\n ...Object.entries(devDependencies).map(\n ([name, version]): CodePackageSdk => ({\n name,\n version: typeof version === 'string' ? version : undefined,\n isDevDependency: true,\n }),\n ),\n ...Object.entries(optionalDependencies).map(\n ([name, version]): CodePackageSdk => ({\n name,\n version: typeof version === 'string' ? version : undefined,\n }),\n ),\n ],\n },\n ];\n },\n};\n","import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { findAllWithRegex } from '@transcend-io/type-utils';\nimport { listFiles } from '../../api-keys';\nimport { dirname, join } from 'path';\nimport { CodePackageType } from '@transcend-io/privacy-types';\n\nconst REQUIREMENTS_PACKAGE_MATCH = /(.+?)(=+)(.+)/;\nconst PACKAGE_NAME = /name *= *('|\")(.+?)('|\")/;\nconst PACKAGE_DESCRIPTION = /description *= *('|\")(.+?)('|\")/;\n\nexport const pythonRequirementsTxt: CodeScanningConfig = {\n supportedFiles: ['requirements.txt'],\n ignoreDirs: ['build', 'lib', 'lib64'],\n scanFunction: (filePath) => {\n const fileContents = readFileSync(filePath, 'utf-8');\n const directory = dirname(filePath);\n const filesInFolder = listFiles(directory);\n\n // parse setup file for name\n const setupFile = filesInFolder.find((file) => file === 'setup.py');\n const setupFileContents = setupFile\n ? readFileSync(join(directory, setupFile), 'utf-8')\n : undefined;\n const packageName = setupFileContents\n ? (PACKAGE_NAME.exec(setupFileContents) || [])[2]\n : undefined;\n const packageDescription = setupFileContents\n ? (PACKAGE_DESCRIPTION.exec(setupFileContents) || [])[2]\n : undefined;\n\n const targets = findAllWithRegex(\n {\n value: new RegExp(REQUIREMENTS_PACKAGE_MATCH, 'g'),\n matches: ['name', 'equals', 'version'],\n },\n fileContents,\n );\n\n return [\n {\n name: packageName || directory.split('/').pop()!,\n description: packageDescription || undefined,\n type: CodePackageType.RequirementsTxt,\n softwareDevelopmentKits: targets.map((pkg) => ({\n name: pkg.name,\n version: pkg.version,\n })),\n },\n ];\n },\n};\n","import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { findAllWithRegex } from '@transcend-io/type-utils';\nimport { listFiles } from '../../api-keys';\nimport { dirname } from 'path';\nimport { CodePackageType } from '@transcend-io/privacy-types';\n\nconst GEM_PACKAGE_REGEX = /gem *('|\")(.+?)('|\")(, *('|\")(.+?)('|\")|)/;\nconst GEMFILE_PACKAGE_NAME_REGEX = /spec\\.name *= *('|\")(.+?)('|\")/;\nconst GEMFILE_PACKAGE_DESCRIPTION_REGEX =\n /spec\\.description *= *('|\")(.+?)('|\")/;\nconst GEMFILE_PACKAGE_SUMMARY_REGEX = /spec\\.summary *= *('|\")(.+?)('|\")/;\n\nexport const gemfile: CodeScanningConfig = {\n supportedFiles: ['Gemfile'],\n ignoreDirs: ['bin'],\n scanFunction: (filePath) => {\n const fileContents = readFileSync(filePath, 'utf-8');\n const directory = dirname(filePath);\n const filesInFolder = listFiles(directory);\n\n // parse gemspec file for name\n const gemspec = filesInFolder.find((file) => file === '.gemspec');\n const gemspecContents = gemspec\n ? readFileSync(gemspec, 'utf-8')\n : undefined;\n const gemfileName = gemspecContents\n ? (GEMFILE_PACKAGE_NAME_REGEX.exec(gemspecContents) || [])[2]\n : undefined;\n const gemfileDescription = gemspecContents\n ? (GEMFILE_PACKAGE_DESCRIPTION_REGEX.exec(gemspecContents) ||\n GEMFILE_PACKAGE_SUMMARY_REGEX.exec(gemspecContents) ||\n [])[1]\n : undefined;\n\n const targets = findAllWithRegex(\n {\n value: new RegExp(GEM_PACKAGE_REGEX, 'g'),\n matches: [\n 'quote1',\n 'name',\n 'quote2',\n 'hasVersion',\n 'quote3',\n 'version',\n 'quote4',\n ],\n },\n fileContents,\n );\n\n return [\n {\n name: gemfileName || directory.split('/').pop()!,\n description: gemfileDescription || undefined,\n type: CodePackageType.RequirementsTxt,\n softwareDevelopmentKits: targets.map((pkg) => ({\n name: pkg.name,\n version: pkg.version,\n })),\n },\n ];\n },\n};\n","import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { CodePackageType } from '@transcend-io/privacy-types';\nimport yaml from 'js-yaml';\nimport { dirname } from 'path';\n\n/**\n * Remove YAML comments from a string\n *\n * @param yamlString - YAML string\n * @returns String without comments\n */\nfunction removeYAMLComments(yamlString: string): string {\n return yamlString\n .split('\\n')\n .map((line) => {\n // Remove inline comments\n const commentIndex = line.indexOf('#');\n if (commentIndex > -1) {\n // Check if '#' is not inside a string\n if (\n !line.substring(0, commentIndex).includes('\"') &&\n !line.substring(0, commentIndex).includes(\"'\")\n ) {\n return line.substring(0, commentIndex).trim();\n }\n }\n return line;\n })\n .filter((line) => line.length > 0)\n .join('\\n');\n}\n\nexport const pubspec: CodeScanningConfig = {\n supportedFiles: ['pubspec.yml'],\n ignoreDirs: ['build'],\n scanFunction: (filePath) => {\n const directory = dirname(filePath);\n const fileContents = readFileSync(filePath, 'utf-8');\n const {\n name,\n description,\n dev_dependencies = {},\n dependencies = {},\n } = yaml.load(removeYAMLComments(fileContents)) as {\n /** Name */\n name?: string;\n /** Description */\n description?: string;\n /** Dev dependencies */\n dev_dependencies?: { [k in string]: number | Record<string, string> };\n /** Dependencies */\n dependencies?: { [k in string]: number | Record<string, string> };\n };\n return [\n {\n name: name || directory.split('/').pop()!,\n description,\n type: CodePackageType.RequirementsTxt,\n softwareDevelopmentKits: [\n ...Object.entries(dependencies).map(([name, version]) => ({\n name,\n version:\n typeof version === 'string'\n ? version\n : typeof version === 'number'\n ? version.toString()\n : version?.sdk,\n })),\n ...Object.entries(dev_dependencies).map(([name, version]) => ({\n name,\n version:\n typeof version === 'string'\n ? version\n : typeof version === 'number'\n ? version.toString()\n : version?.sdk,\n isDevDependency: true,\n })),\n ],\n },\n ];\n },\n};\n","import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { CodePackageSdk } from '../../../codecs';\nimport { dirname } from 'path';\n\nexport const composerJson: CodeScanningConfig = {\n supportedFiles: ['composer.json'],\n ignoreDirs: ['vendor', 'node_modules', 'cache', 'build', 'dist'],\n scanFunction: (filePath) => {\n const file = readFileSync(filePath, 'utf-8');\n const directory = dirname(filePath);\n const asJson = JSON.parse(file);\n const {\n name,\n description,\n require: requireDependencies = {},\n 'require-dev': requiredDevDependencies = {},\n } = asJson;\n return [\n {\n // name of the package\n name: name || directory.split('/').pop()!,\n description,\n softwareDevelopmentKits: [\n ...Object.entries(requireDependencies).map(\n ([name, version]): CodePackageSdk => ({\n name,\n version: typeof version === 'string' ? version : undefined,\n }),\n ),\n ...Object.entries(requiredDevDependencies).map(\n ([name, version]): CodePackageSdk => ({\n name,\n version: typeof version === 'string' ? version : undefined,\n isDevDependency: true,\n }),\n ),\n ],\n },\n ];\n },\n};\n","import { readFileSync } from 'fs';\nimport { CodeScanningConfig } from '../types';\nimport { CodePackageType } from '@transcend-io/privacy-types';\nimport { decodeCodec } from '@transcend-io/type-utils';\nimport * as t from 'io-ts';\nimport { dirname } from 'path';\n\nconst SwiftPackage = t.type({\n pins: t.array(\n t.type({\n identity: t.string,\n kind: t.string,\n location: t.string,\n state: t.type({\n revision: t.string,\n version: t.string,\n }),\n }),\n ),\n version: t.number,\n});\n\nexport const swift: CodeScanningConfig = {\n supportedFiles: ['Package.resolved'],\n ignoreDirs: [],\n scanFunction: (filePath) => {\n const fileContents = readFileSync(filePath, 'utf-8');\n\n const parsed = decodeCodec(SwiftPackage, fileContents);\n\n return [\n {\n name: dirname(filePath).split('/').pop() || '', // FIXME pull from Package.swift ->> name if possible\n type: CodePackageType.CocoaPods, // FIXME should be swift\n softwareDevelopmentKits: parsed.pins.map((target) => ({\n name: target.identity,\n version: target.state.version,\n })),\n },\n ];\n },\n};\n","import { CodeScanningConfig } from './types';\nimport {\n cocoaPods,\n gradle,\n javascriptPackageJson,\n gemfile,\n composerJson,\n pubspec,\n swift,\n pythonRequirementsTxt,\n} from './integrations';\nimport { CodePackageType } from '@transcend-io/privacy-types';\n\n/**\n * @deprecated TODO: https://transcend.height.app/T-32325 - use code scanning instead\n */\nexport const SILO_DISCOVERY_CONFIGS: {\n [k in string]: CodeScanningConfig;\n} = {\n cocoaPods,\n gradle,\n javascriptPackageJson,\n pythonRequirementsTxt,\n gemfile,\n pubspec,\n swift,\n};\n\nexport const CODE_SCANNING_CONFIGS: {\n [k in CodePackageType]: CodeScanningConfig;\n} = {\n [CodePackageType.CocoaPods]: cocoaPods,\n [CodePackageType.Gradle]: gradle,\n [CodePackageType.PackageJson]: javascriptPackageJson,\n [CodePackageType.RequirementsTxt]: pythonRequirementsTxt,\n [CodePackageType.Gemfile]: gemfile,\n [CodePackageType.Pubspec]: pubspec,\n [CodePackageType.ComposerJson]: composerJson,\n [CodePackageType.Swift]: swift,\n};\n","import fastGlob from 'fast-glob';\nimport colors from 'colors';\nimport { CodePackageInput } from '../../codecs';\nimport { getEntries } from '@transcend-io/type-utils';\nimport { CODE_SCANNING_CONFIGS } from './constants';\nimport { logger } from '../../logger';\n\n/**\n * Helper to scan and discovery all of the code packages within a folder\n *\n * @param options - Options\n * @returns the list of integrations\n */\nexport async function findCodePackagesInFolder({\n scanPath,\n ignoreDirs = [],\n repositoryName,\n}: {\n /** The name of the github repository reporting packages for */\n repositoryName: string;\n /** Where to look for package.json files */\n scanPath: string;\n /** The directories to ignore (excludes node_modules and serverless-build) */\n ignoreDirs?: string[];\n}): Promise<CodePackageInput[]> {\n const allCodePackages = await Promise.all(\n getEntries(CODE_SCANNING_CONFIGS).map(async ([codePackageType, config]) => {\n const {\n ignoreDirs: configIgnoreDirs,\n supportedFiles,\n scanFunction,\n } = config;\n const dirsToIgnore = [...ignoreDirs, ...configIgnoreDirs].filter(\n (dir) => dir.length > 0,\n );\n try {\n const filesToScan: string[] = await fastGlob(\n `${scanPath}/**/${supportedFiles.join('|')}`,\n {\n ignore: dirsToIgnore.map((dir: string) => `${scanPath}/**/${dir}`),\n unique: true,\n onlyFiles: true,\n },\n );\n logger.info(\n colors.magenta(\n `Scanning: ${filesToScan.length} files of type ${codePackageType}`,\n ),\n );\n const allPackages = filesToScan\n .map((filePath) =>\n scanFunction(filePath).map((result) => ({\n ...result,\n relativePath: filePath.replace(`${scanPath}/`, ''),\n })),\n )\n .flat();\n logger.info(\n colors.green(\n `Found: ${allPackages.length} packages and ${\n allPackages\n .map(\n ({ softwareDevelopmentKits = [] }) => softwareDevelopmentKits,\n )\n .flat().length\n } sdks`,\n ),\n );\n\n return allPackages.map(\n (pkg): CodePackageInput => ({\n ...pkg,\n type: codePackageType,\n repositoryName,\n }),\n );\n } catch (error) {\n throw new Error(\n `Error scanning globs ${supportedFiles} with error: ${error}`,\n );\n }\n }),\n );\n\n return allCodePackages.flat();\n}\n"],"mappings":"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","names":["readFileSync","findAllWithRegex","CodePackageType","POD_TARGET_REGEX","POD_PACKAGE_REGEX","cocoaPods","filePath","fileContents","targets","packages","target","ind","pkg","readFileSync","findAllWithRegex","dirname","GRADLE_IMPLEMENTATION_REGEX","GRADLE_PLUGIN_REGEX","GRADLE_IMPLEMENTATION_GROUP_REGEX","GRADLE_APPLICATION_NAME_REGEX","gradle","filePath","fileContents","directory","targets","targetPlugins","targetGroups","applications","target","readFileSync","dirname","javascriptPackageJson","filePath","file","directory","asJson","name","description","dependencies","devDependencies","optionalDependencies","version","readFileSync","findAllWithRegex","dirname","join","CodePackageType","REQUIREMENTS_PACKAGE_MATCH","PACKAGE_NAME","PACKAGE_DESCRIPTION","pythonRequirementsTxt","filePath","fileContents","readFileSync","directory","setupFile","listFiles","file","setupFileContents","packageName","packageDescription","targets","findAllWithRegex","pkg","readFileSync","findAllWithRegex","dirname","CodePackageType","GEM_PACKAGE_REGEX","GEMFILE_PACKAGE_NAME_REGEX","GEMFILE_PACKAGE_DESCRIPTION_REGEX","GEMFILE_PACKAGE_SUMMARY_REGEX","gemfile","filePath","fileContents","readFileSync","directory","gemspec","listFiles","file","gemspecContents","gemfileName","gemfileDescription","targets","findAllWithRegex","pkg","readFileSync","CodePackageType","yaml","dirname","removeYAMLComments","yamlString","line","commentIndex","pubspec","filePath","directory","fileContents","name","description","dev_dependencies","dependencies","version","readFileSync","dirname","composerJson","filePath","file","directory","asJson","name","description","requireDependencies","requiredDevDependencies","version","readFileSync","CodePackageType","decodeCodec","t","dirname","SwiftPackage","swift","filePath","fileContents","parsed","target","CodePackageType","SILO_DISCOVERY_CONFIGS","cocoaPods","gradle","javascriptPackageJson","pythonRequirementsTxt","gemfile","pubspec","swift","CODE_SCANNING_CONFIGS","composerJson","fastGlob","colors","getEntries","findCodePackagesInFolder","scanPath","ignoreDirs","repositoryName","getEntries","CODE_SCANNING_CONFIGS","codePackageType","config","configIgnoreDirs","supportedFiles","scanFunction","dirsToIgnore","dir","filesToScan","fastGlob","logger","colors","allPackages","filePath","result","softwareDevelopmentKits","pkg","error"]}
@@ -0,0 +1,2 @@
1
+ import{e as o}from"./chunk-ARVEJERC.js";import*as e from"io-ts";import{valuesOf as a}from"@transcend-io/type-utils";var d=({TRouteName:t})=>e.type({routeName:t,enabledPolicies:e.array(a(o))});import*as r from"io-ts";var l=({TEnabledRoutes:t})=>r.type({enabledRoutes:t});export{d as a,l as b};
2
+ //# sourceMappingURL=chunk-347UQP43.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/helpers/buildEnabledRouteType.ts","../src/lib/helpers/buildAIIntegrationType.ts"],"sourcesContent":["import * as t from 'io-ts';\nimport { EnabledRouteC } from '../../codecs';\nimport { valuesOf } from '@transcend-io/type-utils';\nimport { PathfinderPolicyName } from '../../enums';\n\n/**\n * Builds a custom io-ts type that represents a route allowed by the proxy\n *\n * @param TRouteName - the string with the name of the allowed route\n * @returns custom io-ts AllowedRoute type\n */\nexport const buildEnabledRouteType = <T extends t.Mixed>({\n TRouteName,\n}: {\n /** the type of the routeName property */\n TRouteName: T;\n}): EnabledRouteC<T> =>\n t.type({\n routeName: TRouteName,\n enabledPolicies: t.array(valuesOf(PathfinderPolicyName)),\n });\n","import * as t from 'io-ts';\nimport { AIIntegrationC, EnabledRouteC } from '../../codecs';\n\n/**\n * Helper to build a custom io-ts type representing an AIIntegration\n *\n * @param TEnabledRoutes - the type of the enabledRoutes for the AIIntegration type\n * @returns an AIIntegration type\n */\nexport const buildAIIntegrationType = <\n T extends t.Mixed,\n P extends t.ArrayC<EnabledRouteC<T>>,\n>({\n TEnabledRoutes,\n}: {\n /** the type of the enabledRoutes property */\n TEnabledRoutes: P;\n}): AIIntegrationC<T> =>\n t.type({\n enabledRoutes: TEnabledRoutes,\n });\n"],"mappings":"wCAAA,UAAYA,MAAO,QAEnB,OAAS,YAAAC,MAAgB,2BASlB,IAAMC,EAAwB,CAAoB,CACvD,WAAAC,CACF,IAII,OAAK,CACL,UAAWA,EACX,gBAAmB,QAAMC,EAASC,CAAoB,CAAC,CACzD,CAAC,ECpBH,UAAYC,MAAO,QASZ,IAAMC,EAAyB,CAGpC,CACA,eAAAC,CACF,IAII,OAAK,CACL,cAAeA,CACjB,CAAC","names":["t","valuesOf","buildEnabledRouteType","TRouteName","valuesOf","PathfinderPolicyName","t","buildAIIntegrationType","TEnabledRoutes"]}
@@ -0,0 +1,2 @@
1
+ import r from"colors";import{bootstrap as t}from"global-agent";import{ProxyAgent as e,setGlobalDispatcher as s}from"undici";import p from"yargs-parser";var i=console,{httpProxy:o=process.env.http_proxy}=p(process.argv.slice(2));o&&(i.info(r.green(`Initializing proxy: ${o}`)),process.env.GLOBAL_AGENT_HTTP_PROXY=o,t(),s(new e(o)));export{i as a};
2
+ //# sourceMappingURL=chunk-43JWXG77.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logger.ts"],"sourcesContent":["import colors from 'colors';\nimport { bootstrap } from 'global-agent';\nimport { ProxyAgent, setGlobalDispatcher } from 'undici';\nimport yargs from 'yargs-parser';\n\nexport const logger = console;\n\n// When the proxy env var of flag is specified, initiate the proxy\nconst { httpProxy = process.env.http_proxy } = yargs(process.argv.slice(2));\nif (httpProxy) {\n logger.info(colors.green(`Initializing proxy: ${httpProxy}`));\n\n // Use global-agent, which overrides `request` based requests\n process.env.GLOBAL_AGENT_HTTP_PROXY = httpProxy;\n bootstrap();\n\n // Use undici, which overrides `fetch` based requests\n setGlobalDispatcher(new ProxyAgent(httpProxy));\n}\n"],"mappings":"AAAA,OAAOA,MAAY,SACnB,OAAS,aAAAC,MAAiB,eAC1B,OAAS,cAAAC,EAAY,uBAAAC,MAA2B,SAChD,OAAOC,MAAW,eAEX,IAAMC,EAAS,QAGhB,CAAE,UAAAC,EAAY,QAAQ,IAAI,UAAW,EAAIF,EAAM,QAAQ,KAAK,MAAM,CAAC,CAAC,EACtEE,IACFD,EAAO,KAAKL,EAAO,MAAM,uBAAuBM,CAAS,EAAE,CAAC,EAG5D,QAAQ,IAAI,wBAA0BA,EACtCL,EAAU,EAGVE,EAAoB,IAAID,EAAWI,CAAS,CAAC","names":["colors","bootstrap","ProxyAgent","setGlobalDispatcher","yargs","logger","httpProxy"]}
@@ -0,0 +1,2 @@
1
+ function o(s){let e=s.split(",").filter(r=>!!r),t={};return e.forEach(r=>{let[i,n]=r.split(":");if(!i||!n)throw new Error(`Invalid variable: ${r}. Expected format: key:value`);t[i]=n}),t}export{o as a};
2
+ //# sourceMappingURL=chunk-4GLITB3Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/helpers/parseVariablesFromString.ts"],"sourcesContent":["/**\n * Parse variables from string\n *\n * @param variables - Variables as string\n * @returns Variables as object\n */\nexport function parseVariablesFromString(variables: string): {\n [k in string]: string;\n} {\n // Parse out the variables\n const splitVars = variables.split(',').filter((x) => !!x);\n const vars: { [k in string]: string } = {};\n splitVars.forEach((variable) => {\n const [k, v] = variable.split(':');\n if (!k || !v) {\n throw new Error(\n `Invalid variable: ${variable}. Expected format: key:value`,\n );\n }\n vars[k] = v;\n });\n return vars;\n}\n"],"mappings":"AAMO,SAASA,EAAyBC,EAEvC,CAEA,IAAMC,EAAYD,EAAU,MAAM,GAAG,EAAE,OAAQE,GAAM,CAAC,CAACA,CAAC,EAClDC,EAAkC,CAAC,EACzC,OAAAF,EAAU,QAASG,GAAa,CAC9B,GAAM,CAACC,EAAGC,CAAC,EAAIF,EAAS,MAAM,GAAG,EACjC,GAAI,CAACC,GAAK,CAACC,EACT,MAAM,IAAI,MACR,qBAAqBF,CAAQ,8BAC/B,EAEFD,EAAKE,CAAC,EAAIC,CACZ,CAAC,EACMH,CACT","names":["parseVariablesFromString","variables","splitVars","x","vars","variable","k","v"]}
@@ -0,0 +1,3 @@
1
+ import{c as _}from"./chunk-MA4JWWRO.js";import{n as A,q as x}from"./chunk-ZTD7APNF.js";import{Ae as O,Be as D,_ as T,_b as j,b as R,pe as y,qe as E,ye as L}from"./chunk-TDBKATQK.js";import{a as r}from"./chunk-43JWXG77.js";import{e as b}from"./chunk-L5ULN3IT.js";import{RequestStatus as U}from"@transcend-io/privacy-types";import k from"colors";import{groupBy as G,uniq as Q}from"lodash-es";async function te({file:u,auth:s,sombraAuth:g,requestActions:f=[],concurrency:p=100,transcendUrl:n=b}){let o=y(n,s),e=await E(n,s,g);r.info(k.magenta(`Pulling manual enrichment requests, filtered for actions: ${f.join(",")}`));let d=await L(o,{actions:f,statuses:[U.Enriching]}),i=[];await R(d,async t=>{let c=await D(o,{requestId:t.id});if(c.filter(({status:m})=>m==="ACTION_REQUIRED")){let m=await O(o,e,{requestId:t.id});i.push({...t,requestIdentifiers:m,requestEnrichers:c})}},{concurrency:p});let l=i.map(({attributeValues:t,requestIdentifiers:c,requestEnrichers:I,...m})=>({...m,...Object.entries(G(c,"name")).reduce((w,[P,$])=>Object.assign(w,{[P]:$.map(({value:C})=>C).join(",")}),{}),...Object.entries(G(t,"attributeKey.name")).reduce((w,[P,$])=>Object.assign(w,{[P]:$.map(({name:C})=>C).join(",")}),{})})),a=Q(l.map(t=>Object.keys(t)).flat());return _(u,l,a),r.info(k.green(`Successfully wrote ${i.length} requests to file "${u}"`)),i}import*as q from"io-ts";import{uniq as F}from"lodash-es";import v from"colors";var S="https://app.transcend.io/privacy-requests/incoming-requests/",M=q.record(q.string,q.string);async function N(u,{id:s,...g},f,p){if(!s){let e=`Request ID must be provided to enricher request.${p?` Found error in row: ${p}`:""}`;throw r.error(v.red(e)),new Error(e)}let n=s.toLowerCase(),o=Object.entries(g).reduce((e,[d,i])=>F(A(i)).length===0?e:Object.assign(e,{[d]:F(A(i)).map(a=>({value:d==="email"?a.toLowerCase():a}))}),{});try{return await u.post("v1/enrich-identifiers",{headers:{"x-transcend-request-id":n,"x-transcend-enricher-id":f},json:{enrichedIdentifiers:o}}).json(),r.error(v.green(`Successfully enriched request: ${S}${n}`)),!0}catch(e){if(typeof e.response.body=="string"&&e.response.body.includes("Cannot update a resolved RequestEnricher"))return r.warn(v.magenta(`Skipped enrichment for request: ${S}${n}, request is no longer in the enriching phase.`)),!1;throw r.error(v.red(`Failed to enricher identifiers for request with id: ${S}${n} - ${e.message} - ${e.response.body}`)),e}}import h from"colors";async function ge({file:u,auth:s,sombraAuth:g,enricherId:f,markSilent:p,concurrency:n=100,transcendUrl:o=b}){let e=await E(o,s,g),d=y(o,s);r.info(h.magenta(`Reading "${u}" from disk`));let i=x(u,M);r.info(h.magenta(`Enriching "${i.length}" privacy requests.`));let l=0,a=0,t=0;if(await R(i,async(c,I)=>{try{p&&(await j(d,T,{input:{id:c.id,isSilent:!0}}),r.info(h.magenta(`Mark request as silent mode - ${c.id}`))),await N(e,c,f,I)?l+=1:a+=1}catch{t+=1}},{concurrency:n}),r.info(h.green(`Successfully notified Transcend!
2
+ Success count: ${l}.`)),a>0&&r.info(h.magenta(`Skipped count: ${a}.`)),t>0)throw r.info(h.red(`Error Count: ${t}.`)),new Error(`Failed to enrich: ${t} requests.`);return i.length}export{te as a,M as b,N as c,ge as d};
3
+ //# sourceMappingURL=chunk-6P4FW6XR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/manual-enrichment/pullManualEnrichmentIdentifiersToCsv.ts","../src/lib/manual-enrichment/enrichPrivacyRequest.ts","../src/lib/manual-enrichment/pushManualEnrichmentIdentifiersFromCsv.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport { map } from '@/lib/bluebird-replace';\nimport colors from 'colors';\nimport { groupBy, uniq } from 'lodash-es';\nimport { DEFAULT_TRANSCEND_API } from '../../constants';\nimport { writeCsv } from '../cron/writeCsv';\nimport {\n PrivacyRequest,\n RequestEnricher,\n RequestIdentifier,\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchAllRequestEnrichers,\n fetchAllRequestIdentifiers,\n fetchAllRequests,\n} from '../graphql';\nimport { logger } from '../../logger';\n\nexport interface PrivacyRequestWithIdentifiers extends PrivacyRequest {\n /** Request Enrichers */\n requestEnrichers: RequestEnricher[];\n /** Request Identifiers */\n requestIdentifiers: RequestIdentifier[];\n}\n\n/**\n * Pull the set of manual enrichment jobs to CSV\n *\n * @param options - Options\n * @returns List of requests with identifiers\n */\nexport async function pullManualEnrichmentIdentifiersToCsv({\n file,\n auth,\n sombraAuth,\n requestActions = [],\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Sombra API key */\n sombraAuth?: string;\n /** Concurrency */\n concurrency?: number;\n /** The request actions to fetch */\n requestActions?: RequestAction[];\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<PrivacyRequestWithIdentifiers[]> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const sombra = await createSombraGotInstance(transcendUrl, auth, sombraAuth);\n\n logger.info(\n colors.magenta(\n `Pulling manual enrichment requests, filtered for actions: ${requestActions.join(\n ',',\n )}`,\n ),\n );\n\n // Pull all privacy requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses: [RequestStatus.Enriching],\n });\n\n // Requests to save\n const savedRequests: PrivacyRequestWithIdentifiers[] = [];\n\n // Filter down requests to what is needed\n await map(\n allRequests,\n async (request) => {\n // Fetch enrichers\n const requestEnrichers = await fetchAllRequestEnrichers(client, {\n requestId: request.id,\n });\n\n // Check if manual enrichment exists for that request\n const hasManualEnrichment = requestEnrichers.filter(\n ({ status }) => status === 'ACTION_REQUIRED',\n );\n\n // Save request to queue\n if (hasManualEnrichment) {\n const requestIdentifiers = await fetchAllRequestIdentifiers(\n client,\n sombra,\n {\n requestId: request.id,\n },\n );\n savedRequests.push({\n ...request,\n requestIdentifiers,\n requestEnrichers,\n });\n }\n },\n {\n concurrency,\n },\n );\n\n const data = savedRequests.map(\n ({\n attributeValues,\n requestIdentifiers,\n requestEnrichers, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...request\n }) => ({\n ...request,\n // flatten identifiers\n ...Object.entries(groupBy(requestIdentifiers, 'name')).reduce(\n (acc, [key, values]) =>\n Object.assign(acc, {\n [key]: values.map(({ value }) => value).join(','),\n }),\n {},\n ),\n // flatten attributes\n ...Object.entries(groupBy(attributeValues, 'attributeKey.name')).reduce(\n (acc, [key, values]) =>\n Object.assign(acc, {\n [key]: values.map(({ name }) => name).join(','),\n }),\n {},\n ),\n }),\n );\n\n // Write out to CSV\n const headers = uniq(data.map((d) => Object.keys(d)).flat());\n writeCsv(file, data, headers);\n\n logger.info(\n colors.green(\n `Successfully wrote ${savedRequests.length} requests to file \"${file}\"`,\n ),\n );\n\n return savedRequests;\n}\n","import type { Got } from 'got';\nimport * as t from 'io-ts';\nimport { logger } from '../../logger';\nimport { uniq } from 'lodash-es';\nimport colors from 'colors';\nimport { splitCsvToList } from '../requests/splitCsvToList';\n\nconst ADMIN_URL =\n 'https://app.transcend.io/privacy-requests/incoming-requests/';\n/**\n * Minimal set required to mark as completed\n */\nexport const EnrichPrivacyRequest = t.record(t.string, t.string);\n\n/** Type override */\nexport type EnrichPrivacyRequest = t.TypeOf<typeof EnrichPrivacyRequest>;\n\n/**\n * Upload identifiers to a privacy request or mark request as\n *\n * @param sombra - Sombra instance configured to make requests\n * @param request - Request to enricher\n * @param enricherId - The ID of the enricher being uploaded to\n * @param index - Index of request ID\n * @returns True if enriched successfully, false if skipped, throws error if failed\n */\nexport async function enrichPrivacyRequest(\n sombra: Got,\n { id: rawId, ...rest }: EnrichPrivacyRequest,\n enricherId: string,\n index?: number,\n): Promise<boolean> {\n if (!rawId) {\n // error\n const msg = `Request ID must be provided to enricher request.${\n index ? ` Found error in row: ${index}` : ''\n }`;\n logger.error(colors.red(msg));\n throw new Error(msg);\n }\n\n const id = rawId.toLowerCase();\n\n // Pull out the identifiers\n const enrichedIdentifiers = Object.entries(rest).reduce(\n (acc, [key, value]) => {\n const values = uniq(splitCsvToList(value));\n return values.length === 0\n ? acc\n : Object.assign(acc, {\n [key]: uniq(splitCsvToList(value)).map((val) => ({\n value: key === 'email' ? val.toLowerCase() : val,\n })),\n });\n },\n {} as Record<string, string[]>,\n );\n\n // Make the GraphQL request\n try {\n await sombra\n .post('v1/enrich-identifiers', {\n headers: {\n 'x-transcend-request-id': id,\n 'x-transcend-enricher-id': enricherId,\n },\n json: {\n enrichedIdentifiers,\n },\n })\n .json();\n\n logger.error(\n colors.green(`Successfully enriched request: ${ADMIN_URL}${id}`),\n );\n return true;\n } catch (err) {\n // skip if already enriched\n if (\n typeof err.response.body === 'string' &&\n err.response.body.includes('Cannot update a resolved RequestEnricher')\n ) {\n logger.warn(\n colors.magenta(\n `Skipped enrichment for request: ${ADMIN_URL}${id}, request is no longer in the enriching phase.`,\n ),\n );\n return false;\n }\n\n // error\n logger.error(\n colors.red(\n `Failed to enricher identifiers for request with id: ${ADMIN_URL}${id} - ${err.message} - ${err.response.body}`,\n ),\n );\n throw err;\n }\n}\n","import colors from 'colors';\nimport { map } from '@/lib/bluebird-replace';\nimport { logger } from '../../logger';\nimport {\n UPDATE_PRIVACY_REQUEST,\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n makeGraphQLRequest,\n} from '../graphql';\nimport {\n enrichPrivacyRequest,\n EnrichPrivacyRequest,\n} from './enrichPrivacyRequest';\nimport { readCsv } from '../requests';\nimport { DEFAULT_TRANSCEND_API } from '../../constants';\n\n/**\n * Push a CSV of enriched requests back into Transcend\n *\n * @param options - Options\n * @returns Number of items processed\n */\nexport async function pushManualEnrichmentIdentifiersFromCsv({\n file,\n auth,\n sombraAuth,\n enricherId,\n markSilent,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** ID of enricher being uploaded to */\n enricherId: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Mark requests in silent mode before enriching */\n markSilent?: boolean;\n}): Promise<number> {\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, sombraAuth);\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const activeResults = readCsv(file, EnrichPrivacyRequest);\n\n // Notify Transcend\n logger.info(\n colors.magenta(`Enriching \"${activeResults.length}\" privacy requests.`),\n );\n\n let successCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n await map(\n activeResults,\n async (request, index) => {\n try {\n // Mark requests in silent mode before a certain date\n if (markSilent) {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n input: {\n id: request.id,\n isSilent: true,\n },\n });\n\n logger.info(\n colors.magenta(`Mark request as silent mode - ${request.id}`),\n );\n }\n\n const result = await enrichPrivacyRequest(\n sombra,\n request,\n enricherId,\n index,\n );\n if (result) {\n successCount += 1;\n } else {\n skippedCount += 1;\n }\n } catch (err) {\n errorCount += 1;\n }\n },\n { concurrency },\n );\n\n logger.info(\n colors.green(\n `Successfully notified Transcend! \\n Success count: ${successCount}.`,\n ),\n );\n\n if (skippedCount > 0) {\n logger.info(colors.magenta(`Skipped count: ${skippedCount}.`));\n }\n\n if (errorCount > 0) {\n logger.info(colors.red(`Error Count: ${errorCount}.`));\n throw new Error(`Failed to enrich: ${errorCount} requests.`);\n }\n\n return activeResults.length;\n}\n"],"mappings":"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","names":["RequestStatus","colors","groupBy","uniq","pullManualEnrichmentIdentifiersToCsv","file","auth","sombraAuth","requestActions","concurrency","transcendUrl","DEFAULT_TRANSCEND_API","client","buildTranscendGraphQLClient","sombra","createSombraGotInstance","logger","colors","allRequests","fetchAllRequests","RequestStatus","savedRequests","map","request","requestEnrichers","fetchAllRequestEnrichers","status","requestIdentifiers","fetchAllRequestIdentifiers","data","attributeValues","groupBy","acc","key","values","value","name","headers","uniq","d","writeCsv","t","uniq","colors","ADMIN_URL","EnrichPrivacyRequest","enrichPrivacyRequest","sombra","rawId","rest","enricherId","index","msg","logger","colors","id","enrichedIdentifiers","acc","key","value","uniq","splitCsvToList","val","err","colors","pushManualEnrichmentIdentifiersFromCsv","file","auth","sombraAuth","enricherId","markSilent","concurrency","transcendUrl","DEFAULT_TRANSCEND_API","sombra","createSombraGotInstance","client","buildTranscendGraphQLClient","logger","colors","activeResults","readCsv","EnrichPrivacyRequest","successCount","skippedCount","errorCount","map","request","index","makeGraphQLRequest","UPDATE_PRIVACY_REQUEST","enrichPrivacyRequest"]}
@@ -0,0 +1,2 @@
1
+ import t from"fs";import e from"os";import r from"path";function p(o){return{process:o,os:e,fs:t,path:r}}export{p as a};
2
+ //# sourceMappingURL=chunk-72U6ETHG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { StricliAutoCompleteContext } from '@stricli/auto-complete';\nimport type { CommandContext } from '@stricli/core';\n\nexport interface LocalContext\n extends CommandContext,\n StricliAutoCompleteContext {\n /** The Node.js process object */\n readonly process: NodeJS.Process;\n // ...\n}\n\n/**\n * Builds the context for the CLI.\n *\n * @param process - The Node.js process object.\n * @returns The context for the CLI.\n */\nexport function buildContext(process: NodeJS.Process): LocalContext {\n return {\n process,\n os,\n fs,\n path,\n };\n}\n"],"mappings":"AAAA,OAAOA,MAAQ,KACf,OAAOC,MAAQ,KACf,OAAOC,MAAU,OAkBV,SAASC,EAAaC,EAAuC,CAClE,MAAO,CACL,QAAAA,EACA,GAAAH,EACA,GAAAD,EACA,KAAAE,CACF,CACF","names":["fs","os","path","buildContext","process"]}
@@ -0,0 +1,2 @@
1
+ import{q as N}from"./chunk-ZTD7APNF.js";import{De as U,_b as F,a as v,b as q,pe as D,qe as R,ve as O,wa as G}from"./chunk-TDBKATQK.js";import{a as t}from"./chunk-43JWXG77.js";import{e as T}from"./chunk-L5ULN3IT.js";import*as e from"io-ts";import{decodeCodec as Y}from"@transcend-io/type-utils";var Z=e.type({identifier:e.string,type:e.string,coreIdentifier:e.string,dataSiloId:e.string,requestId:e.string,nonce:e.string,requestCreatedAt:e.string,daysUntilOverdue:e.number,attributes:e.array(e.type({key:e.string,values:e.array(e.string)}))});async function L(r,{dataSiloId:s,limit:c=100,offset:n=0,requestType:a}){try{let i=await r.get(`v1/data-silo/${s}/pending-requests/${a}`,{searchParams:{offset:n,limit:c}}).json(),{items:f}=Y(e.type({items:e.array(Z)}),i);return f}catch(i){throw new Error(`Received an error from server: ${i?.response?.body||i?.message}`)}}import*as S from"io-ts";var B=S.type({nonce:S.string,identifier:S.string});async function j(r,{nonce:s,identifier:c}){try{return await r.put("v1/data-silo",{headers:{"x-transcend-nonce":s},json:{profiles:[{profileId:c}]}}),!0}catch(n){if(n.response?.statusCode===409)return!1;throw new Error(`Received an error from server: ${n?.response?.body||n?.message}`)}}import{chunk as W}from"lodash-es";import p from"colors";import Q from"cli-progress";async function ue({file:r,dataSiloId:s,auth:c,sombraAuth:n,concurrency:a=100,transcendUrl:i=T,sleepSeconds:f=10}){let y=await R(i,c,n);t.info(p.magenta(`Reading "${r}" from disk`));let o=N(r,B);t.info(p.magenta(`Notifying Transcend for data silo "${s}" marking "${o.length}" identifiers as completed.`));let C=new Date().getTime(),w=new Q.SingleBar({},Q.Presets.shades_classic),d=0,u=0,l=0;w.start(o.length,0);let m=W(o,a),I=m.length;await v(m,async($,P)=>{t.info(p.blue(`Processing chunk ${P+1}/${I} (${W.length} items)`)),await q($,async h=>{try{await j(y,h)?d+=1:u+=1}catch(b){t.error(p.red(`Error notifying Transcend for identifier "${h.identifier}" - ${b?.message}`)),l+=1}w.update(d+u)}),f>0&&P<I-1&&(t.info(p.yellow(`Sleeping for ${f}s before next chunk...`)),await new Promise(h=>{setTimeout(h,f*1e3)}))}),w.stop();let x=new Date().getTime()-C;if(t.info(p.green(`Successfully notified Transcend for ${d} identifiers in "${x/1e3}" seconds!`)),u&&t.info(p.magenta(`There were ${u} identifiers that were not in a state to be updated.They likely have already been resolved.`)),l)throw t.error(p.red(`There were ${l} identifiers that failed to be updated. Please review the logs for more information.`)),new Error("Failed to update all identifiers");return o.length}import z from"colors";import H from"cli-progress";import{RequestDataSiloStatus as ee}from"@transcend-io/privacy-types";async function Te({requestIds:r,dataSiloId:s,auth:c,concurrency:n=100,status:a=ee.Resolved,transcendUrl:i=T}){let f=D(i,c),y=new Date().getTime(),o=new H.SingleBar({},H.Presets.shades_classic);t.info(z.magenta(`Notifying Transcend for data silo "${s}" marking "${r.length}" requests as completed.`));let C=0;o.start(r.length,0),await q(r,async u=>{let l=await U(f,{requestId:u,dataSiloId:s});try{await F(f,G,{requestDataSiloId:l.id,status:a})}catch(m){if(!m.message.includes("Client error: Request must be active:"))throw m}C+=1,o.update(C)},{concurrency:n}),o.stop();let d=new Date().getTime()-y;return t.info(z.green(`Successfully notified Transcend in "${d/1e3}" seconds!`)),r.length}import k from"colors";import J from"cli-progress";async function ke({dataSiloId:r,auth:s,sombraAuth:c,actions:n,apiPageSize:a=100,savePageSize:i=1e3,onSave:f,transcendUrl:y=T,skipRequestCount:o=!1}){if(i%a!==0)throw new Error(`savePageSize must be a multiple of apiPageSize. savePageSize: ${i}, apiPageSize: ${a}`);let C=await R(y,s,c),w=D(y,s),d=0;o||(d=await O(w,{dataSiloId:r})),t.info(k.magenta(`Pulling ${o?"all":d} outstanding request identifiers for data silo: "${r}" for requests of types "${n.join('", "')}"`));let u=new Date().getTime(),l=new J.SingleBar({},J.Presets.shades_classic),m=new Set,I=[],g=[];o||l.start(d,0),await v(n,async $=>{let P=0,h=!0;for(;h;){let b=await L(C,{dataSiloId:r,limit:a,offset:P,requestType:$}),E=b.map(A=>(m.add(A.requestId),{...A,action:$})),M=E.map(({attributes:A,...V})=>({...V,...A.reduce((X,_)=>Object.assign(X,{[_.key]:_.values.join(",")}),{})}));I.push(...E),g.push(...M),g.length>=i&&(await f(g),g=[]),h=b.length===a,P+=a,o?t.info(k.magenta(`Pulled ${b.length} outstanding identifiers for ${m.size} requests`)):l.update(m.size)}}),g.length>0&&await f(g),o||l.stop();let x=new Date().getTime()-u;return t.info(k.green(`Successfully pulled ${I.length} outstanding identifiers from ${m.size} requests in "${x/1e3}" seconds!`)),{identifiers:I}}export{Z as a,L as b,B as c,j as d,ue as e,Te as f,ke as g};
2
+ //# sourceMappingURL=chunk-7QHA6ZIV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/cron/pullCronPageOfIdentifiers.ts","../src/lib/cron/markCronIdentifierCompleted.ts","../src/lib/cron/pushCronIdentifiersFromCsv.ts","../src/lib/cron/markRequestDataSiloIdsCompleted.ts","../src/lib/cron/pullChunkedCustomSiloOutstandingIdentifiers.ts"],"sourcesContent":["import * as t from 'io-ts';\nimport { decodeCodec } from '@transcend-io/type-utils';\nimport { RequestAction } from '@transcend-io/privacy-types';\nimport type { Got } from 'got';\n\nexport const CronIdentifier = t.type({\n /** The identifier value */\n identifier: t.string,\n /** The type of identifier */\n type: t.string,\n /** The core identifier of the request */\n coreIdentifier: t.string,\n /** The ID of the underlying data silo */\n dataSiloId: t.string,\n /** The ID of the underlying request */\n requestId: t.string,\n /** The request nonce */\n nonce: t.string,\n /** The time the request was created */\n requestCreatedAt: t.string,\n /** The number of days until the request is overdue */\n daysUntilOverdue: t.number,\n /** Request attributes */\n attributes: t.array(\n t.type({\n key: t.string,\n values: t.array(t.string),\n }),\n ),\n});\n\n/** Type override */\nexport type CronIdentifier = t.TypeOf<typeof CronIdentifier>;\n\n/**\n * Pull a offset of identifiers for a cron job\n *\n * @see https://docs.transcend.io/docs/api-reference/GET/v1/data-silo/(id)/pending-requests/(type)\n * @param sombra - Sombra instance configured to make requests\n * @param options - Additional options\n * @returns Successfully submitted request\n */\nexport async function pullCronPageOfIdentifiers(\n sombra: Got,\n {\n dataSiloId,\n limit = 100,\n offset = 0,\n requestType,\n }: {\n /** Data Silo ID */\n dataSiloId: string;\n /** Type of request */\n requestType: RequestAction;\n /** Number of identifiers to pull in */\n limit?: number;\n /** Page to pull in */\n offset?: number;\n },\n): Promise<CronIdentifier[]> {\n try {\n // Make the GraphQL request\n const response = await sombra\n .get(`v1/data-silo/${dataSiloId}/pending-requests/${requestType}`, {\n searchParams: {\n offset,\n limit,\n },\n })\n .json();\n\n const { items } = decodeCodec(\n t.type({\n items: t.array(CronIdentifier),\n }),\n response,\n );\n return items;\n } catch (err) {\n throw new Error(\n `Received an error from server: ${err?.response?.body || err?.message}`,\n );\n }\n}\n","import type { Got } from 'got';\nimport * as t from 'io-ts';\n\n/**\n * Minimal set required to mark as completed\n */\nexport const CronIdentifierPush = t.type({\n nonce: t.string,\n identifier: t.string,\n});\n\n/** Type override */\nexport type CronIdentifierPush = t.TypeOf<typeof CronIdentifierPush>;\n\n/**\n * Mark an identifier output by the cron job as completed.\n *\n * @see https://docs.transcend.io/docs/api-reference/PUT/v1/data-silo\n * @param sombra - Sombra instance configured to make requests\n * @param options - Additional options\n * @returns Successfully submitted request, false if not in a state to update\n */\nexport async function markCronIdentifierCompleted(\n sombra: Got,\n { nonce, identifier }: CronIdentifierPush,\n): Promise<boolean> {\n try {\n // Make the GraphQL request\n await sombra.put('v1/data-silo', {\n headers: {\n 'x-transcend-nonce': nonce,\n },\n json: {\n profiles: [\n {\n profileId: identifier,\n },\n ],\n },\n });\n return true;\n } catch (err) {\n // handle gracefully\n if (err.response?.statusCode === 409) {\n return false;\n }\n throw new Error(\n `Received an error from server: ${err?.response?.body || err?.message}`,\n );\n }\n}\n","import { map, mapSeries } from '@/lib/bluebird-replace';\nimport { chunk } from 'lodash-es';\nimport { createSombraGotInstance } from '../graphql';\nimport colors from 'colors';\nimport {\n markCronIdentifierCompleted,\n CronIdentifierPush,\n} from './markCronIdentifierCompleted';\nimport cliProgress from 'cli-progress';\nimport { logger } from '../../logger';\nimport { readCsv } from '../requests';\nimport { DEFAULT_TRANSCEND_API } from '../../constants';\n\n/**\n * Given a CSV of cron job outputs, mark all requests as completed in Transcend\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function pushCronIdentifiersFromCsv({\n file,\n dataSiloId,\n auth,\n sombraAuth,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n sleepSeconds = 10,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Sleep time in seconds between chunks of concurrent calls */\n sleepSeconds?: number;\n}): Promise<number> {\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, sombraAuth);\n\n // Read from CSV\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const activeResults = readCsv(file, CronIdentifierPush);\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Notifying Transcend for data silo \"${dataSiloId}\" marking \"${activeResults.length}\" identifiers as completed.`,\n ),\n );\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n\n let successCount = 0;\n let failureCount = 0;\n let errorCount = 0;\n progressBar.start(activeResults.length, 0);\n\n // Process in chunks with sleep intervals\n const chunks = chunk(activeResults, concurrency);\n const totalChunks = chunks.length;\n const processChunk = async (\n items: CronIdentifierPush[],\n chunkIndex: number,\n ): Promise<void> => {\n logger.info(\n colors.blue(\n `Processing chunk ${chunkIndex + 1}/${totalChunks} (${\n chunk.length\n } items)`,\n ),\n );\n\n // Process the items of the chunk concurrently\n await map(items, async (identifier) => {\n try {\n const success = await markCronIdentifierCompleted(sombra, identifier);\n if (success) {\n successCount += 1;\n } else {\n failureCount += 1;\n }\n } catch (e) {\n logger.error(\n colors.red(\n `Error notifying Transcend for identifier \"${identifier.identifier}\" - ${e?.message}`,\n ),\n );\n errorCount += 1;\n }\n progressBar.update(successCount + failureCount);\n });\n\n // Sleep between chunks (except for the last chunk)\n if (sleepSeconds > 0 && chunkIndex < totalChunks - 1) {\n logger.info(\n colors.yellow(`Sleeping for ${sleepSeconds}s before next chunk...`),\n );\n\n await new Promise((resolve) => {\n setTimeout(resolve, sleepSeconds * 1000);\n });\n }\n };\n\n // Process all chunks sequentially\n await mapSeries(chunks, processChunk);\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully notified Transcend for ${successCount} identifiers in \"${\n totalTime / 1000\n }\" seconds!`,\n ),\n );\n if (failureCount) {\n logger.info(\n colors.magenta(\n `There were ${failureCount} identifiers that were not in a state to be updated.` +\n 'They likely have already been resolved.',\n ),\n );\n }\n if (errorCount) {\n logger.error(\n colors.red(\n `There were ${errorCount} identifiers that failed to be updated. Please review the logs for more information.`,\n ),\n );\n throw new Error('Failed to update all identifiers');\n }\n return activeResults.length;\n}\n","import { map } from '@/lib/bluebird-replace';\nimport colors from 'colors';\nimport { logger } from '../../logger';\nimport {\n CHANGE_REQUEST_DATA_SILO_STATUS,\n fetchRequestDataSilo,\n makeGraphQLRequest,\n buildTranscendGraphQLClient,\n} from '../graphql';\nimport cliProgress from 'cli-progress';\nimport { DEFAULT_TRANSCEND_API } from '../../constants';\nimport { RequestDataSiloStatus } from '@transcend-io/privacy-types';\n\n/**\n * Given a CSV of Request IDs, mark associated RequestDataSilos as completed\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function markRequestDataSiloIdsCompleted({\n requestIds,\n dataSiloId,\n auth,\n concurrency = 100,\n status = RequestDataSiloStatus.Resolved,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The list of request ids to mark as completed */\n requestIds: string[];\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Status to update requests to */\n status?: RequestDataSiloStatus;\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Notifying Transcend for data silo \"${dataSiloId}\" marking \"${requestIds.length}\" requests as completed.`,\n ),\n );\n\n let total = 0;\n progressBar.start(requestIds.length, 0);\n await map(\n requestIds,\n async (requestId) => {\n const requestDataSilo = await fetchRequestDataSilo(client, {\n requestId,\n dataSiloId,\n });\n\n try {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, CHANGE_REQUEST_DATA_SILO_STATUS, {\n requestDataSiloId: requestDataSilo.id,\n status,\n });\n } catch (err) {\n if (!err.message.includes('Client error: Request must be active:')) {\n throw err;\n }\n }\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully notified Transcend in \"${totalTime / 1000}\" seconds!`,\n ),\n );\n return requestIds.length;\n}\n","import {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchRequestDataSiloActiveCount,\n} from '../graphql';\nimport colors from 'colors';\nimport cliProgress from 'cli-progress';\nimport {\n pullCronPageOfIdentifiers,\n CronIdentifier,\n} from './pullCronPageOfIdentifiers';\nimport { RequestAction } from '@transcend-io/privacy-types';\n\nimport { logger } from '../../logger';\nimport { DEFAULT_TRANSCEND_API } from '../../constants';\nimport { mapSeries } from '@/lib/bluebird-replace';\n\n/**\n * A CSV formatted identifier\n */\nexport type CsvFormattedIdentifier = {\n [k in string]: string | null | boolean | number;\n};\n\nexport interface CronIdentifierWithAction extends CronIdentifier {\n /** The request action that the identifier relates to */\n action: RequestAction;\n}\n\n/**\n * Pull the set of identifiers outstanding for a cron or AVC integration\n *\n * This function is designed to be used in a loop, and will call the onSave callback\n * with a chunk of identifiers when the savePageSize is reached.\n *\n * @param options - Options\n * @returns The identifiers and identifiers formatted for CSV\n */\nexport async function pullChunkedCustomSiloOutstandingIdentifiers({\n dataSiloId,\n auth,\n sombraAuth,\n actions,\n apiPageSize = 100,\n savePageSize = 1000,\n onSave,\n transcendUrl = DEFAULT_TRANSCEND_API,\n skipRequestCount = false,\n}: {\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** The request actions to fetch */\n actions: RequestAction[];\n /** How many identifiers to pull in a single call to the backend */\n apiPageSize: number;\n /** How many identifiers to save at a time (usually to a CSV file, should be a multiple of apiPageSize) */\n savePageSize: number;\n /** Callback function called when a chunk of identifiers is ready to be saved */\n onSave: (chunk: CsvFormattedIdentifier[]) => Promise<void>;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Skip request count */\n skipRequestCount?: boolean;\n}): Promise<{\n /** Raw Identifiers */\n identifiers: CronIdentifierWithAction[];\n}> {\n // Validate savePageSize\n if (savePageSize % apiPageSize !== 0) {\n throw new Error(\n `savePageSize must be a multiple of apiPageSize. savePageSize: ${savePageSize}, apiPageSize: ${apiPageSize}`,\n );\n }\n\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, sombraAuth);\n\n // Create GraphQL client to connect to Transcend backend\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n let totalRequestCount = 0;\n if (!skipRequestCount) {\n totalRequestCount = await fetchRequestDataSiloActiveCount(client, {\n dataSiloId,\n });\n }\n\n logger.info(\n colors.magenta(\n `Pulling ${\n skipRequestCount ? 'all' : totalRequestCount\n } outstanding request identifiers ` +\n `for data silo: \"${dataSiloId}\" for requests of types \"${actions.join(\n '\", \"',\n )}\"`,\n ),\n );\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n const foundRequestIds = new Set<string>();\n\n // identifiers found in total\n const identifiers: CronIdentifierWithAction[] = [];\n // current chunk of identifiers to be saved\n let currentChunk: CsvFormattedIdentifier[] = [];\n\n // map over each action\n if (!skipRequestCount) {\n progressBar.start(totalRequestCount, 0);\n }\n await mapSeries(actions, async (action) => {\n let offset = 0;\n let shouldContinue = true;\n\n // Fetch a page of identifiers\n while (shouldContinue) {\n const pageIdentifiers = await pullCronPageOfIdentifiers(sombra, {\n dataSiloId,\n limit: apiPageSize,\n offset,\n requestType: action,\n });\n\n const identifiersWithAction: CronIdentifierWithAction[] =\n pageIdentifiers.map((identifier) => {\n foundRequestIds.add(identifier.requestId);\n return {\n ...identifier,\n action,\n };\n });\n\n const csvFormattedIdentifiers = identifiersWithAction.map(\n ({ attributes, ...identifier }) => ({\n ...identifier,\n ...attributes.reduce(\n (acc, val) =>\n Object.assign(acc, {\n [val.key]: val.values.join(','),\n }),\n {},\n ),\n }),\n );\n\n identifiers.push(...identifiersWithAction);\n currentChunk.push(...csvFormattedIdentifiers);\n\n // Check if we've reached the savePageSize and call the onSave callback\n if (currentChunk.length >= savePageSize) {\n await onSave(currentChunk);\n currentChunk = [];\n }\n\n shouldContinue = pageIdentifiers.length === apiPageSize;\n offset += apiPageSize;\n if (!skipRequestCount) {\n progressBar.update(foundRequestIds.size);\n } else {\n logger.info(\n colors.magenta(\n `Pulled ${pageIdentifiers.length} outstanding identifiers for ${foundRequestIds.size} requests`,\n ),\n );\n }\n }\n });\n\n // Save any remaining identifiers in the current chunk\n if (currentChunk.length > 0) {\n await onSave(currentChunk);\n }\n\n if (!skipRequestCount) {\n progressBar.stop();\n }\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully pulled ${identifiers.length} outstanding identifiers from ${\n foundRequestIds.size\n } requests in \"${totalTime / 1000}\" seconds!`,\n ),\n );\n\n return { identifiers };\n}\n"],"mappings":"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","names":["t","decodeCodec","CronIdentifier","pullCronPageOfIdentifiers","sombra","dataSiloId","limit","offset","requestType","response","items","err","t","CronIdentifierPush","markCronIdentifierCompleted","sombra","nonce","identifier","err","chunk","colors","cliProgress","pushCronIdentifiersFromCsv","file","dataSiloId","auth","sombraAuth","concurrency","transcendUrl","DEFAULT_TRANSCEND_API","sleepSeconds","sombra","createSombraGotInstance","logger","colors","activeResults","readCsv","CronIdentifierPush","t0","progressBar","cliProgress","successCount","failureCount","errorCount","chunks","chunk","totalChunks","mapSeries","items","chunkIndex","map","identifier","markCronIdentifierCompleted","e","resolve","totalTime","colors","cliProgress","RequestDataSiloStatus","markRequestDataSiloIdsCompleted","requestIds","dataSiloId","auth","concurrency","status","transcendUrl","DEFAULT_TRANSCEND_API","client","buildTranscendGraphQLClient","t0","progressBar","cliProgress","logger","colors","total","map","requestId","requestDataSilo","fetchRequestDataSilo","makeGraphQLRequest","CHANGE_REQUEST_DATA_SILO_STATUS","err","totalTime","colors","cliProgress","pullChunkedCustomSiloOutstandingIdentifiers","dataSiloId","auth","sombraAuth","actions","apiPageSize","savePageSize","onSave","transcendUrl","DEFAULT_TRANSCEND_API","skipRequestCount","sombra","createSombraGotInstance","client","buildTranscendGraphQLClient","totalRequestCount","fetchRequestDataSiloActiveCount","logger","colors","t0","progressBar","cliProgress","foundRequestIds","identifiers","currentChunk","mapSeries","action","offset","shouldContinue","pageIdentifiers","pullCronPageOfIdentifiers","identifiersWithAction","identifier","csvFormattedIdentifiers","attributes","acc","val","totalTime"]}
@@ -0,0 +1,2 @@
1
+ import{makeEnum as e}from"@transcend-io/type-utils";var a=(s=>(s.Json="json",s))(a||{}),o=(s=>(s.Assessments="assessments",s))(o||{}),p=(i=>(i.OneTrust="oneTrust",i.File="file",i))(p||{}),m=(t=>(t.ApiKeys="apiKeys",t.Attributes="customFields",t.Templates="templates",t.DataSilos="dataSilos",t.Enrichers="enrichers",t.DataFlows="dataFlows",t.BusinessEntities="businessEntities",t.Actions="actions",t.DataSubjects="dataSubjects",t.Identifiers="identifiers",t.Cookies="cookies",t.ConsentManager="consentManager",t.Partitions="partitions",t.Prompts="prompts",t.PromptPartials="promptPartials",t.PromptGroups="promptGroups",t.Agents="agents",t.AgentFunctions="agentFunctions",t.AgentFiles="agentFiles",t.Vendors="vendors",t.DataCategories="dataCategories",t.ProcessingPurposes="processingPurposes",t.ActionItems="actionItems",t.ActionItemCollections="actionItemCollections",t.Teams="teams",t.PrivacyCenters="privacyCenters",t.Policies="policies",t.Messages="messages",t.Assessments="assessments",t.AssessmentTemplates="assessmentTemplates",t.Purposes="purposes",t))(m||{}),n=e({RedactEmail:"redactEmail",Log:"log",LogToTranscend:"logToTranscend",ApplyTranscendPolicies:"applyTranscendPolicies"}),h=e({ChatCompletion:"/v1/chat/completions",Embeddings:"/v1/embeddings",Completions:"/v1/completions",Agents:"/v1/assistants",Agent:"/v1/assistants/:assistantId",Threads:"/v1/threads",Thread:"/v1/threads/:threadId",Messages:"/v1/threads/:threadId/messages",Message:"/v1/threads/:threadId/messages/:messageId",Runs:"/v1/threads/:threadId/runs",Run:"/v1/threads/:threadId/runs/:runId",Files:"/v1/files",File:"/v1/files/:fileId"});export{a,o as b,p as c,m as d,n as e,h as f};
2
+ //# sourceMappingURL=chunk-ARVEJERC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/enums.ts"],"sourcesContent":["import { makeEnum } from '@transcend-io/type-utils';\n\n/** Accepted file formats for exporting resources from OneTrust */\nexport enum OneTrustFileFormat {\n Json = 'json',\n}\n\n/**\n * Resources that can be pulled in from OneTrust\n */\nexport enum OneTrustPullResource {\n Assessments = 'assessments',\n}\n\n/**\n * Where to read OneTrust resources from\n */\nexport enum OneTrustPullSource {\n OneTrust = 'oneTrust',\n File = 'file',\n}\n\n/**\n * Resources that can be pulled in\n */\nexport enum TranscendPullResource {\n ApiKeys = 'apiKeys',\n Attributes = 'customFields',\n Templates = 'templates',\n DataSilos = 'dataSilos',\n Enrichers = 'enrichers',\n DataFlows = 'dataFlows',\n BusinessEntities = 'businessEntities',\n Actions = 'actions',\n DataSubjects = 'dataSubjects',\n Identifiers = 'identifiers',\n Cookies = 'cookies',\n ConsentManager = 'consentManager',\n Partitions = 'partitions',\n Prompts = 'prompts',\n PromptPartials = 'promptPartials',\n PromptGroups = 'promptGroups',\n Agents = 'agents',\n AgentFunctions = 'agentFunctions',\n AgentFiles = 'agentFiles',\n Vendors = 'vendors',\n DataCategories = 'dataCategories',\n ProcessingPurposes = 'processingPurposes',\n ActionItems = 'actionItems',\n ActionItemCollections = 'actionItemCollections',\n Teams = 'teams',\n PrivacyCenters = 'privacyCenters',\n Policies = 'policies',\n Messages = 'messages',\n Assessments = 'assessments',\n AssessmentTemplates = 'assessmentTemplates',\n Purposes = 'purposes',\n}\n\n/**\n * Names of built in policies for pathfinder\n */\nexport const PathfinderPolicyName = makeEnum({\n RedactEmail: 'redactEmail',\n Log: 'log',\n LogToTranscend: 'logToTranscend',\n ApplyTranscendPolicies: 'applyTranscendPolicies',\n});\n\n/**\n * Type override\n */\nexport type PathfinderPolicyName =\n (typeof PathfinderPolicyName)[keyof typeof PathfinderPolicyName];\n\n/**\n * The names of the OpenAI routes that we support setting policies for\n * reference: https://platform.openai.com/docs/api-reference/introduction\n */\nexport const OpenAIRouteName = makeEnum({\n ChatCompletion: '/v1/chat/completions',\n Embeddings: '/v1/embeddings',\n Completions: '/v1/completions',\n Agents: '/v1/assistants',\n Agent: '/v1/assistants/:assistantId',\n Threads: '/v1/threads',\n Thread: '/v1/threads/:threadId',\n Messages: '/v1/threads/:threadId/messages',\n Message: '/v1/threads/:threadId/messages/:messageId',\n Runs: '/v1/threads/:threadId/runs',\n Run: '/v1/threads/:threadId/runs/:runId',\n Files: '/v1/files',\n File: '/v1/files/:fileId',\n});\n\n/**\n * Type override\n */\nexport type OpenAIRouteName =\n (typeof OpenAIRouteName)[keyof typeof OpenAIRouteName];\n"],"mappings":"AAAA,OAAS,YAAAA,MAAgB,2BAGlB,IAAKC,OACVA,EAAA,KAAO,OADGA,OAAA,IAOAC,OACVA,EAAA,YAAc,cADJA,OAAA,IAOAC,OACVA,EAAA,SAAW,WACXA,EAAA,KAAO,OAFGA,OAAA,IAQAC,OACVA,EAAA,QAAU,UACVA,EAAA,WAAa,eACbA,EAAA,UAAY,YACZA,EAAA,UAAY,YACZA,EAAA,UAAY,YACZA,EAAA,UAAY,YACZA,EAAA,iBAAmB,mBACnBA,EAAA,QAAU,UACVA,EAAA,aAAe,eACfA,EAAA,YAAc,cACdA,EAAA,QAAU,UACVA,EAAA,eAAiB,iBACjBA,EAAA,WAAa,aACbA,EAAA,QAAU,UACVA,EAAA,eAAiB,iBACjBA,EAAA,aAAe,eACfA,EAAA,OAAS,SACTA,EAAA,eAAiB,iBACjBA,EAAA,WAAa,aACbA,EAAA,QAAU,UACVA,EAAA,eAAiB,iBACjBA,EAAA,mBAAqB,qBACrBA,EAAA,YAAc,cACdA,EAAA,sBAAwB,wBACxBA,EAAA,MAAQ,QACRA,EAAA,eAAiB,iBACjBA,EAAA,SAAW,WACXA,EAAA,SAAW,WACXA,EAAA,YAAc,cACdA,EAAA,oBAAsB,sBACtBA,EAAA,SAAW,WA/BDA,OAAA,IAqCCC,EAAuBL,EAAS,CAC3C,YAAa,cACb,IAAK,MACL,eAAgB,iBAChB,uBAAwB,wBAC1B,CAAC,EAYYM,EAAkBN,EAAS,CACtC,eAAgB,uBAChB,WAAY,iBACZ,YAAa,kBACb,OAAQ,iBACR,MAAO,8BACP,QAAS,cACT,OAAQ,wBACR,SAAU,iCACV,QAAS,4CACT,KAAM,6BACN,IAAK,oCACL,MAAO,YACP,KAAM,mBACR,CAAC","names":["makeEnum","OneTrustFileFormat","OneTrustPullResource","OneTrustPullSource","TranscendPullResource","PathfinderPolicyName","OpenAIRouteName"]}
@@ -0,0 +1,2 @@
1
+ import{union as c}from"lodash-es";function f(l,{adTechPurposes:p=["SaleOfInfo"],serviceToTitle:s,serviceToSupportedIntegration:r}){let e=[],i=[],n={};l.forEach(t=>{let{service:a,attributes:h=[]}=t;if(!a||a==="internalService")return;let u=h.find(o=>o.key==="Found on Domain");u&&(n[a]||(n[a]=[]),n[a].push(...u.values.map(o=>o.replace("https://","").replace("http://",""))),n[a]=[...new Set(n[a])]),c(t.trackingPurposes,p).length>0?(i.push(a),e.includes(a)&&(e=e.filter(o=>o!==a))):i.includes(a)||e.push(a)});let m=[...new Set(i)].map(t=>({title:s[t],...r[t]?{integrationName:t}:{integrationName:"promptAPerson","outer-type":t},attributes:[{key:"Tech Type",values:["Ad Tech"]},{key:"Found On Domain",values:n[t]||[]}]}));return{siteTechDataSilos:[...new Set(e)].map(t=>({title:s[t],...r[t]?{integrationName:t}:{integrationName:"promptAPerson",outerType:t},attributes:[{key:"Tech Type",values:["Site Tech"]},{key:"Found On Domain",values:n[t]||[]}]})),adTechDataSilos:m}}export{f as a};
2
+ //# sourceMappingURL=chunk-CBAHSBSW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/consent-manager/dataFlowsToDataSilos.ts"],"sourcesContent":["import { DataFlowInput, DataSiloInput } from '../../codecs';\nimport { union } from 'lodash-es';\nimport { IndexedCatalogs } from '../graphql';\n\n/**\n * Convert data flow configurations into a set of data silo configurations\n *\n * @param inputs - Data flow input to convert to data silos\n * @param options - Additional options\n * @returns Business entity configuration input\n */\nexport function dataFlowsToDataSilos(\n inputs: DataFlowInput[],\n {\n adTechPurposes = ['SaleOfInfo'],\n serviceToTitle,\n serviceToSupportedIntegration,\n }: IndexedCatalogs & {\n /** List of purposes that are considered \"Ad Tech\" */\n adTechPurposes?: string[];\n },\n): {\n /** List of data silo configurations for site-tech services */\n siteTechDataSilos: DataSiloInput[];\n /** List of data silo configurations for ad-tech services */\n adTechDataSilos: DataSiloInput[];\n} {\n // List of site tech integrations\n let siteTechIntegrations: string[] = [];\n\n // List of ad tech integrations\n const adTechIntegrations: string[] = [];\n\n // Mapping from service name to list of\n const serviceToFoundOnDomain: { [k in string]: string[] } = {};\n\n // iterate over each flow\n inputs.forEach((flow) => {\n // process data flows with services\n const { service, attributes = [] } = flow;\n if (!service || service === 'internalService') {\n return;\n }\n\n // create mapping to found on domain\n const foundOnDomain = attributes.find(\n (attr) => attr.key === 'Found on Domain',\n );\n\n // Create a list of all domains where the data flow was found\n if (foundOnDomain) {\n if (!serviceToFoundOnDomain[service]) {\n serviceToFoundOnDomain[service] = [];\n }\n serviceToFoundOnDomain[service]!.push(\n ...foundOnDomain.values.map((v) =>\n v.replace('https://', '').replace('http://', ''),\n ),\n );\n serviceToFoundOnDomain[service] = [\n ...new Set(serviceToFoundOnDomain[service]),\n ];\n }\n\n // Keep track of ad tech\n if (union(flow.trackingPurposes, adTechPurposes).length > 0) {\n // add service to ad tech list\n adTechIntegrations.push(service);\n\n // remove from site tech list\n if (siteTechIntegrations.includes(service)) {\n siteTechIntegrations = siteTechIntegrations.filter(\n (s) => s !== service,\n );\n }\n } else if (!adTechIntegrations.includes(service)) {\n // add to site tech list\n siteTechIntegrations.push(service);\n }\n });\n\n // create the list of ad tech integrations\n const adTechDataSilos = [...new Set(adTechIntegrations)].map((service) => ({\n title: serviceToTitle[service],\n ...(serviceToSupportedIntegration[service]\n ? { integrationName: service }\n : { integrationName: 'promptAPerson', 'outer-type': service }),\n attributes: [\n {\n key: 'Tech Type',\n values: ['Ad Tech'],\n },\n {\n key: 'Found On Domain',\n values: serviceToFoundOnDomain[service] || [],\n },\n ],\n }));\n\n // create the list of site tech integrations\n const siteTechDataSilos = [...new Set(siteTechIntegrations)].map(\n (service) => ({\n title: serviceToTitle[service],\n ...(serviceToSupportedIntegration[service]\n ? { integrationName: service }\n : { integrationName: 'promptAPerson', outerType: service }),\n attributes: [\n {\n key: 'Tech Type',\n values: ['Site Tech'],\n },\n {\n key: 'Found On Domain',\n values: serviceToFoundOnDomain[service] || [],\n },\n ],\n }),\n );\n\n return {\n siteTechDataSilos,\n adTechDataSilos,\n };\n}\n"],"mappings":"AACA,OAAS,SAAAA,MAAa,YAUf,SAASC,EACdC,EACA,CACE,eAAAC,EAAiB,CAAC,YAAY,EAC9B,eAAAC,EACA,8BAAAC,CACF,EASA,CAEA,IAAIC,EAAiC,CAAC,EAGhCC,EAA+B,CAAC,EAGhCC,EAAsD,CAAC,EAG7DN,EAAO,QAASO,GAAS,CAEvB,GAAM,CAAE,QAAAC,EAAS,WAAAC,EAAa,CAAC,CAAE,EAAIF,EACrC,GAAI,CAACC,GAAWA,IAAY,kBAC1B,OAIF,IAAME,EAAgBD,EAAW,KAC9BE,GAASA,EAAK,MAAQ,iBACzB,EAGID,IACGJ,EAAuBE,CAAO,IACjCF,EAAuBE,CAAO,EAAI,CAAC,GAErCF,EAAuBE,CAAO,EAAG,KAC/B,GAAGE,EAAc,OAAO,IAAKE,GAC3BA,EAAE,QAAQ,WAAY,EAAE,EAAE,QAAQ,UAAW,EAAE,CACjD,CACF,EACAN,EAAuBE,CAAO,EAAI,CAChC,GAAG,IAAI,IAAIF,EAAuBE,CAAO,CAAC,CAC5C,GAIEV,EAAMS,EAAK,iBAAkBN,CAAc,EAAE,OAAS,GAExDI,EAAmB,KAAKG,CAAO,EAG3BJ,EAAqB,SAASI,CAAO,IACvCJ,EAAuBA,EAAqB,OACzCS,GAAMA,IAAML,CACf,IAEQH,EAAmB,SAASG,CAAO,GAE7CJ,EAAqB,KAAKI,CAAO,CAErC,CAAC,EAGD,IAAMM,EAAkB,CAAC,GAAG,IAAI,IAAIT,CAAkB,CAAC,EAAE,IAAKG,IAAa,CACzE,MAAON,EAAeM,CAAO,EAC7B,GAAIL,EAA8BK,CAAO,EACrC,CAAE,gBAAiBA,CAAQ,EAC3B,CAAE,gBAAiB,gBAAiB,aAAcA,CAAQ,EAC9D,WAAY,CACV,CACE,IAAK,YACL,OAAQ,CAAC,SAAS,CACpB,EACA,CACE,IAAK,kBACL,OAAQF,EAAuBE,CAAO,GAAK,CAAC,CAC9C,CACF,CACF,EAAE,EAsBF,MAAO,CACL,kBApBwB,CAAC,GAAG,IAAI,IAAIJ,CAAoB,CAAC,EAAE,IAC1DI,IAAa,CACZ,MAAON,EAAeM,CAAO,EAC7B,GAAIL,EAA8BK,CAAO,EACrC,CAAE,gBAAiBA,CAAQ,EAC3B,CAAE,gBAAiB,gBAAiB,UAAWA,CAAQ,EAC3D,WAAY,CACV,CACE,IAAK,YACL,OAAQ,CAAC,WAAW,CACtB,EACA,CACE,IAAK,kBACL,OAAQF,EAAuBE,CAAO,GAAK,CAAC,CAC9C,CACF,CACF,EACF,EAIE,gBAAAM,CACF,CACF","names":["union","dataFlowsToDataSilos","inputs","adTechPurposes","serviceToTitle","serviceToSupportedIntegration","siteTechIntegrations","adTechIntegrations","serviceToFoundOnDomain","flow","service","attributes","foundOnDomain","attr","v","s","adTechDataSilos"]}
@@ -0,0 +1,2 @@
1
+ import{k as i}from"./chunk-ZTD7APNF.js";import o from"inquirer";import m from"inquirer-autocomplete-prompt";async function c({message:e}){let{response:r}=await o.prompt([{name:"response",message:e,type:"confirm"}]);return r}async function l({message:e}){let{response:r}=await o.prompt([{name:"response",message:e,type:"text",validate:t=>t.trim().length>0}]);return r}async function y({defaultValue:e,values:r,message:t}){o.registerPrompt("autocomplete",m);let{response:p}=await o.prompt([{name:"response",message:t,type:"autocomplete",default:e,source:(a,n)=>n?r.filter(s=>typeof s=="string"&&i(n,s)):r}]);return p}export{c as a,l as b,y as c};
2
+ //# sourceMappingURL=chunk-HH2PQ3PQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/helpers/inquirer.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport autoCompletePrompt from 'inquirer-autocomplete-prompt';\nimport { fuzzySearch } from '../requests';\nimport { ObjByString } from '@transcend-io/type-utils';\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n */\nexport async function inquirerConfirmBoolean({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<boolean> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: boolean;\n }>([\n {\n name: 'response',\n message,\n type: 'confirm',\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n */\nexport async function inquirerConfirmText({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<string> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'text',\n validate: (x) => x.trim().length > 0,\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer auto complete\n *\n * @param options - Options\n */\nexport async function inquirerAutoComplete({\n defaultValue,\n values,\n message,\n}: {\n /** Default value */\n defaultValue?: string;\n /** Message */\n message: string;\n /** Values to select */\n values: string[];\n}): Promise<string> {\n inquirer.registerPrompt('autocomplete', autoCompletePrompt);\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'autocomplete',\n default: defaultValue,\n source: (answersSoFar: ObjByString, input: string) =>\n !input\n ? values\n : values.filter(\n (x) => typeof x === 'string' && fuzzySearch(input, x),\n ),\n },\n ]);\n return response;\n}\n"],"mappings":"wCAAA,OAAOA,MAAc,WACrB,OAAOC,MAAwB,+BAS/B,eAAsBC,EAAuB,CAC3C,QAAAC,CACF,EAGqB,CACnB,GAAM,CAAE,SAAAC,CAAS,EAAI,MAAMC,EAAS,OAGjC,CACD,CACE,KAAM,WACN,QAAAF,EACA,KAAM,SACR,CACF,CAAC,EACD,OAAOC,CACT,CAOA,eAAsBE,EAAoB,CACxC,QAAAH,CACF,EAGoB,CAClB,GAAM,CAAE,SAAAC,CAAS,EAAI,MAAMC,EAAS,OAGjC,CACD,CACE,KAAM,WACN,QAAAF,EACA,KAAM,OACN,SAAWI,GAAMA,EAAE,KAAK,EAAE,OAAS,CACrC,CACF,CAAC,EACD,OAAOH,CACT,CAOA,eAAsBI,EAAqB,CACzC,aAAAC,EACA,OAAAC,EACA,QAAAP,CACF,EAOoB,CAClBE,EAAS,eAAe,eAAgBM,CAAkB,EAC1D,GAAM,CAAE,SAAAP,CAAS,EAAI,MAAMC,EAAS,OAGjC,CACD,CACE,KAAM,WACN,QAAAF,EACA,KAAM,eACN,QAASM,EACT,OAAQ,CAACG,EAA2BC,IACjCA,EAEGH,EAAO,OACJH,GAAM,OAAOA,GAAM,UAAYO,EAAYD,EAAON,CAAC,CACtD,EAHAG,CAIR,CACF,CAAC,EACD,OAAON,CACT","names":["inquirer","autoCompletePrompt","inquirerConfirmBoolean","message","response","inquirer","inquirerConfirmText","x","inquirerAutoComplete","defaultValue","values","autoCompletePrompt","answersSoFar","input","fuzzySearch"]}
@@ -0,0 +1,9 @@
1
+ import{e as o,f as i}from"./chunk-L5ULN3IT.js";import{d as n}from"./chunk-ARVEJERC.js";import{buildCommand as p,numberParser as m}from"@stricli/core";import{ConsentTrackerStatus as u}from"@transcend-io/privacy-types";import{ScopeName as f,TRANSCEND_SCOPES as s}from"@transcend-io/privacy-types";function b(e){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e))throw new Error(`Invalid UUID format: ${e}`);return e}function a(e){try{return new URL(e).toString().replace(/\/$/,"")}catch{throw new Error(`Invalid URL format: ${e}`)}}function g(e){return e.split(",").map(r=>r.trim()).filter(r=>r.length>0)}function S(e){let r=new Date(e);if(Number.isNaN(r.getTime()))throw new TypeError(`Invalid date: ${e}. Try using the ISO 8601 format (YYYY-MM-DDTHH:MM:SS.SSSZ)`);return r}var l=({scopes:e,requiresSiloScope:r=!1})=>{let t={kind:"parsed",parse:String,brief:"The Transcend API key."};return r&&(t.brief+=" This key must be associated with the data silo(s) being operated on."),e==="Varies"?{...t,brief:`${t.brief} The scopes required will vary depending on the operation performed. If in doubt, the ${s[f.FullAdmin].title} scope will always work.`}:e.length===0?{...t,brief:`${t.brief} No scopes are required for this command.`}:{...t,brief:`${t.brief} Requires scopes: ${e.map(c=>`"${s[c].title}"`).join(", ")}`}},d=(e=o)=>({kind:"parsed",parse:a,brief:"URL of the Transcend backend. Use https://api.us.transcend.io for US hosting",default:e}),U=(e=i)=>({kind:"parsed",parse:a,brief:"URL of the Transcend consent backend. Use https://consent.us.transcend.io for US hosting",default:e}),D=()=>({kind:"parsed",parse:String,brief:"The Sombra internal key, use for additional authentication when self-hosting Sombra",optional:!0});var h=["dataSilos","enrichers","templates","apiKeys"],v=Object.values(u),C=p({loader:async()=>{let{pull:e}=await import("./impl-3M5R6G5M.js");return e},parameters:{flags:{auth:l({scopes:"Varies"}),resources:{kind:"enum",values:["all",...Object.values(n)],brief:`The different resource types to pull in. Defaults to ${h.join(",")}.`,variadic:",",optional:!0},file:{kind:"parsed",parse:String,brief:"Path to the YAML file to pull into",default:"./transcend.yml"},transcendUrl:d(),dataSiloIds:{kind:"parsed",parse:String,variadic:",",brief:"The UUIDs of the data silos that should be pulled into the YAML file",optional:!0},integrationNames:{kind:"parsed",parse:String,variadic:",",brief:"The types of integrations to pull down",optional:!0},trackerStatuses:{kind:"enum",values:Object.values(u),variadic:",",brief:"The statuses of consent manager trackers to pull down. Defaults to all statuses.",optional:!0},pageSize:{kind:"parsed",parse:m,brief:"The page size to use when paginating over the API",default:"50"},skipDatapoints:{kind:"boolean",brief:"When true, skip pulling in datapoints alongside data silo resource",default:!1},skipSubDatapoints:{kind:"boolean",brief:"When true, skip pulling in subDatapoints alongside data silo resource",default:!1},includeGuessedCategories:{kind:"boolean",brief:"When true, included guessed data categories that came from the content classifier",default:!1},debug:{kind:"boolean",brief:"Set to true to include debug logs while pulling the configuration",default:!1}}},docs:{brief:"Pull metadata from Transcend into transcend.yml",fullDescription:`Generates a transcend.yml by pulling the configuration from your Transcend instance.
2
+
3
+ The API key needs various scopes depending on the resources being pulled (see the CLI's README for more details).
4
+
5
+ This command can be helpful if you are looking to:
6
+
7
+ - Copy your data into another instance
8
+ - Generate a transcend.yml file as a starting point to maintain parts of your data inventory in code.`}});export{b as a,g as b,S as c,l as d,d as e,U as f,D as g,h,v as i,C as j};
9
+ //# sourceMappingURL=chunk-INLBXSQE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/inventory/pull/command.ts","../src/cli/common-parameters.ts","../src/cli/parsers.ts"],"sourcesContent":["import { buildCommand, numberParser } from '@stricli/core';\nimport { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '@/cli/common-parameters';\nimport { TranscendPullResource } from '@/enums';\n\nexport const DEFAULT_TRANSCEND_PULL_RESOURCES = [\n TranscendPullResource.DataSilos,\n TranscendPullResource.Enrichers,\n TranscendPullResource.Templates,\n TranscendPullResource.ApiKeys,\n];\n\nexport const DEFAULT_CONSENT_TRACKER_STATUSES =\n Object.values(ConsentTrackerStatus);\n\nexport const pullCommand = buildCommand({\n loader: async () => {\n const { pull } = await import('./impl');\n return pull;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: 'Varies',\n }),\n resources: {\n kind: 'enum',\n values: ['all', ...Object.values(TranscendPullResource)],\n brief: `The different resource types to pull in. Defaults to ${DEFAULT_TRANSCEND_PULL_RESOURCES.join(\n ',',\n )}.`,\n variadic: ',',\n optional: true,\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the YAML file to pull into',\n default: './transcend.yml',\n },\n transcendUrl: createTranscendUrlParameter(),\n dataSiloIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief:\n 'The UUIDs of the data silos that should be pulled into the YAML file',\n optional: true,\n },\n integrationNames: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'The types of integrations to pull down',\n optional: true,\n },\n trackerStatuses: {\n kind: 'enum',\n values: Object.values(ConsentTrackerStatus),\n variadic: ',',\n brief:\n 'The statuses of consent manager trackers to pull down. Defaults to all statuses.',\n optional: true,\n },\n pageSize: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The page size to use when paginating over the API',\n default: '50',\n },\n skipDatapoints: {\n kind: 'boolean',\n brief:\n 'When true, skip pulling in datapoints alongside data silo resource',\n default: false,\n },\n skipSubDatapoints: {\n kind: 'boolean',\n brief:\n 'When true, skip pulling in subDatapoints alongside data silo resource',\n default: false,\n },\n includeGuessedCategories: {\n kind: 'boolean',\n brief:\n 'When true, included guessed data categories that came from the content classifier',\n default: false,\n },\n debug: {\n kind: 'boolean',\n brief:\n 'Set to true to include debug logs while pulling the configuration',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Pull metadata from Transcend into transcend.yml',\n fullDescription: `Generates a transcend.yml by pulling the configuration from your Transcend instance.\n\nThe API key needs various scopes depending on the resources being pulled (see the CLI's README for more details).\n\nThis command can be helpful if you are looking to:\n\n- Copy your data into another instance\n- Generate a transcend.yml file as a starting point to maintain parts of your data inventory in code.`,\n },\n});\n","import { ScopeName, TRANSCEND_SCOPES } from '@transcend-io/privacy-types';\nimport { urlParser } from './parsers';\nimport {\n DEFAULT_TRANSCEND_API,\n DEFAULT_TRANSCEND_CONSENT_API,\n} from '@/constants';\n\n/**\n * Common parameter builders for CLI commands\n * These reduce duplication and ensure consistency across commands\n */\n\n/**\n * Creates a standard authentication parameter\n *\n * @param root0 - The scopes and whether it requires a silo scope\n * @returns The parameter object\n */\nexport const createAuthParameter = ({\n scopes,\n requiresSiloScope = false,\n}: {\n /** The scopes required for the command */\n scopes: ScopeName[] | 'Varies';\n /** Whether the command requires a silo scope */\n requiresSiloScope?: boolean;\n}) => {\n const parameter = {\n kind: 'parsed' as const,\n parse: String,\n brief: 'The Transcend API key.',\n };\n\n if (requiresSiloScope) {\n parameter.brief +=\n ' This key must be associated with the data silo(s) being operated on.';\n }\n\n if (scopes === 'Varies') {\n return {\n ...parameter,\n brief: `${\n parameter.brief\n } The scopes required will vary depending on the operation performed. If in doubt, the ${\n TRANSCEND_SCOPES[ScopeName.FullAdmin].title\n } scope will always work.`,\n };\n }\n\n if (scopes.length === 0) {\n return {\n ...parameter,\n brief: `${parameter.brief} No scopes are required for this command.`,\n };\n }\n\n return {\n ...parameter,\n brief: `${parameter.brief} Requires scopes: ${scopes\n .map((s) => `\"${TRANSCEND_SCOPES[s].title}\"`)\n .join(', ')}`,\n };\n};\n\n/**\n * Creates a standard Transcend URL parameter\n *\n * @param defaultUrl - The default URL to use if not provided\n * @returns The parameter object\n */\nexport const createTranscendUrlParameter = (\n defaultUrl = DEFAULT_TRANSCEND_API,\n) => ({\n kind: 'parsed' as const,\n parse: urlParser,\n brief:\n 'URL of the Transcend backend. Use https://api.us.transcend.io for US hosting',\n default: defaultUrl,\n});\n\n/**\n * Creates a standard Consent URL parameter\n *\n * @param defaultUrl - The default URL to use if not provided\n * @returns The parameter object\n */\nexport const createConsentUrlParameter = (\n defaultUrl = DEFAULT_TRANSCEND_CONSENT_API,\n) => ({\n kind: 'parsed' as const,\n parse: urlParser,\n brief:\n 'URL of the Transcend consent backend. Use https://consent.us.transcend.io for US hosting',\n default: defaultUrl,\n});\n\n/**\n * Creates a standard Sombra authentication parameter\n *\n * @returns The parameter object\n */\nexport const createSombraAuthParameter = () => ({\n kind: 'parsed' as const,\n parse: String,\n brief:\n 'The Sombra internal key, use for additional authentication when self-hosting Sombra',\n optional: true as const,\n});\n","/**\n * Validates and returns a UUID string.\n *\n * @param input - The input string to validate as UUID\n * @returns The validated UUID string\n * @throws Error if input is not a valid UUID\n */\nexport function uuidParser(input: string): string {\n const uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n if (!uuidRegex.test(input)) {\n throw new Error(`Invalid UUID format: ${input}`);\n }\n return input;\n}\n\n/**\n * Validates and returns a URL string.\n *\n * @param input - The input string to validate as URL\n * @returns The validated URL string\n * @throws Error if input is not a valid URL\n */\nexport function urlParser(input: string): string {\n try {\n const url = new URL(input);\n return url.toString().replace(/\\/$/, '');\n } catch {\n throw new Error(`Invalid URL format: ${input}`);\n }\n}\n\n/**\n * Parse a comma-separated string to array.\n * NOTE: Prefer using `variadic` for list arguments instead of this function. This should only be used for arguments which have a default value.\n *\n * @param input - The comma-separated string to parse\n * @returns Array of trimmed, non-empty strings\n */\nexport function arrayParser(input: string): string[] {\n return input\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\n/**\n * Parse a date string to a Date object.\n *\n * @param input - The date string to parse\n * @returns The parsed Date object\n * @throws TypeError if input is not a valid date\n */\nexport function dateParser(input: string): Date {\n const date = new Date(input);\n if (Number.isNaN(date.getTime())) {\n throw new TypeError(\n `Invalid date: ${input}. Try using the ISO 8601 format (YYYY-MM-DDTHH:MM:SS.SSSZ)`,\n );\n }\n return date;\n}\n"],"mappings":"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","names":["buildCommand","numberParser","ConsentTrackerStatus","ScopeName","TRANSCEND_SCOPES","uuidParser","input","urlParser","arrayParser","s","dateParser","date","createAuthParameter","scopes","requiresSiloScope","parameter","TRANSCEND_SCOPES","ScopeName","s","createTranscendUrlParameter","defaultUrl","DEFAULT_TRANSCEND_API","urlParser","createConsentUrlParameter","DEFAULT_TRANSCEND_CONSENT_API","createSombraAuthParameter","DEFAULT_TRANSCEND_PULL_RESOURCES","DEFAULT_CONSENT_TRACKER_STATUSES","ConsentTrackerStatus","pullCommand","buildCommand","pull","createAuthParameter","TranscendPullResource","createTranscendUrlParameter","numberParser"]}
@@ -0,0 +1,75 @@
1
+ import{_b as S,a as w,f as $,i as B,j as T,l as R}from"./chunk-TDBKATQK.js";import{a as i}from"./chunk-43JWXG77.js";import{keyBy as O,uniq as A,chunk as U,sortBy as G}from"lodash-es";import{SubDataPointDataSubCategoryGuessStatus as _}from"@transcend-io/privacy-types";import h from"cli-progress";import{gql as L}from"graphql-request";import f from"colors";async function q(u,{dataSiloIds:e=[],includeGuessedCategories:l,includeAttributes:a,parentCategories:c=[],subCategories:t=[],pageSize:p=1e3}={}){let n=[],m=new Date().getTime(),d=new h.SingleBar({},h.Presets.shades_classic),s={...c.length>0?{category:c}:{},...t.length>0?{subCategoryIds:t}:{},...c.length+t.length>0&&!l?{status:_.Approved}:{},...e.length>0?{dataSilos:e}:{}},{subDataPoints:{totalCount:o}}=await S(u,$,{filterBy:s});i.info(f.magenta("[Step 1/3] Pulling in all subdatapoints")),d.start(o,0);let y=0,D=!1,r,b=0;do try{let{subDataPoints:{nodes:P}}=await S(u,L`
2
+ query TranscendCliSubDataPointCsvExport(
3
+ $filterBy: SubDataPointFiltersInput
4
+ $first: Int!
5
+ $offset: Int!
6
+ ) {
7
+ subDataPoints(
8
+ filterBy: $filterBy
9
+ first: $first
10
+ offset: $offset
11
+ useMaster: false
12
+ ) {
13
+ nodes {
14
+ id
15
+ name
16
+ description
17
+ dataPointId
18
+ dataSiloId
19
+ purposes {
20
+ name
21
+ purpose
22
+ }
23
+ categories {
24
+ name
25
+ category
26
+ }
27
+ ${l?`pendingCategoryGuesses {
28
+ category {
29
+ name
30
+ category
31
+ }
32
+ status
33
+ classifierVersion
34
+ }`:""}
35
+ ${a?`attributeValues {
36
+ attributeKey {
37
+ name
38
+ }
39
+ name
40
+ }`:""}
41
+ }
42
+ }
43
+ }
44
+ `,{first:p,offset:b,filterBy:{...s}});r=P[P.length-1]?.id,n.push(...P),D=P.length===p,y+=P.length,b+=P.length,d.update(y)}catch(P){throw i.error(f.red(`An error fetching subdatapoints for cursor ${r} and offset ${b}`)),P}while(D);d.stop();let C=new Date().getTime()-m,g=G(n,"name");return i.info(f.green(`Successfully pulled in ${g.length} subdatapoints in ${C/1e3} seconds!`)),g}async function F(u,{dataPointIds:e=[],pageSize:l=100}){let a=[],c=new Date().getTime(),t=new h.SingleBar({},h.Presets.shades_classic);i.info(f.magenta(`[Step 2/3] Fetching metadata for ${e.length} datapoints`));let p=U(e,l);t.start(e.length,0);let n=0;await w(p,async s=>{try{let{dataPoints:{nodes:o}}=await S(u,B,{first:l,filterBy:{ids:s}});a.push(...o),n+=s.length,t.update(n)}catch(o){throw i.error(f.red(`An error fetching subdatapoints for IDs ${s.join(", ")}`)),o}}),t.stop();let d=new Date().getTime()-c;return i.info(f.green(`Successfully pulled in ${a.length} dataPoints in ${d/1e3} seconds!`)),a}async function Q(u,{dataSiloIds:e=[],pageSize:l=100}){let a=[],c=new Date().getTime(),t=new h.SingleBar({},h.Presets.shades_classic);i.info(f.magenta(`[Step 3/3] Fetching metadata for ${e.length} data silos`));let p=U(e,l);t.start(e.length,0);let n=0;await w(p,async s=>{try{let{dataSilos:{nodes:o}}=await S(u,R,{first:l,filterBy:{ids:s}});a.push(...o),n+=s.length,t.update(n)}catch(o){throw i.error(f.red(`An error fetching data silos for IDs ${s.join(", ")}`)),o}}),t.stop();let d=new Date().getTime()-c;return i.info(f.green(`Successfully pulled in ${a.length} data silos in ${d/1e3} seconds!`)),a}async function H(u,{dataSiloIds:e=[],includeGuessedCategories:l,includeAttributes:a,parentCategories:c=[],subCategories:t=[],pageSize:p=1e3}={}){let n=await q(u,{dataSiloIds:e,includeGuessedCategories:l,includeAttributes:a,parentCategories:c,subCategories:t,pageSize:p}),m=A(n.map(r=>r.dataPointId)),d=await F(u,{dataPointIds:m}),s=O(d,"id"),o=A(n.map(r=>r.dataSiloId)),y=await Q(u,{dataSiloIds:o}),D=O(y,"id");return n.map(r=>({...r,dataPoint:s[r.dataPointId],dataSilo:D[r.dataSiloId]}))}import x from"cli-progress";import v from"colors";import{gql as E}from"graphql-request";import{sortBy as V}from"lodash-es";async function st(u,{dataSiloIds:e=[],status:l,subCategories:a=[],includeEncryptedSnippets:c,pageSize:t=100}={}){let p=[],n=new Date().getTime(),m=new x.SingleBar({},x.Presets.shades_classic),d={...a.length>0?{subCategoryIds:a}:{},...l?{status:l}:{},...e.length>0?{dataSilos:e}:{}},{unstructuredSubDataPointRecommendations:{totalCount:s}}=await S(u,T,{filterBy:d});i.info(v.magenta("[Step 1/3] Pulling in all subdatapoints")),m.start(s,0);let o=0,y=!1,D,r=0;do try{let{unstructuredSubDataPointRecommendations:{nodes:g}}=await S(u,E`
45
+ query TranscendCliUnstructuredSubDataPointRecommendationCsvExport(
46
+ $filterBy: UnstructuredSubDataPointRecommendationsFilterInput
47
+ $first: Int!
48
+ $offset: Int!
49
+ ) {
50
+ unstructuredSubDataPointRecommendations(
51
+ filterBy: $filterBy
52
+ first: $first
53
+ offset: $offset
54
+ useMaster: false
55
+ ) {
56
+ nodes {
57
+ id
58
+ dataSiloId
59
+ scannedObjectPathId
60
+ scannedObjectId
61
+ ${c?"name":""}
62
+ ${c?"contextSnippet":""}
63
+ dataSubCategory {
64
+ name
65
+ category
66
+ }
67
+ status
68
+ confidence
69
+ classificationMethod
70
+ classifierVersion
71
+ }
72
+ }
73
+ }
74
+ `,{first:t,offset:r,filterBy:{...d}});D=g[g.length-1]?.id,p.push(...g),y=g.length===t,o+=g.length,r+=g.length,m.update(o)}catch(g){throw i.error(v.red(`An error fetching subdatapoints for cursor ${D} and offset ${r}`)),g}while(y);m.stop();let I=new Date().getTime()-n,C=V(p,"name");return i.info(v.green(`Successfully pulled in ${C.length} subdatapoints in ${I/1e3} seconds!`)),C}export{H as a,st as b};
75
+ //# sourceMappingURL=chunk-KRN6Q433.js.map