@transcend-io/cli 10.29.3 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +229 -84
  2. package/dist/app-CR3U95JW.mjs +148 -0
  3. package/dist/app-CR3U95JW.mjs.map +1 -0
  4. package/dist/{approvePrivacyRequests-DmQY27tf.mjs → approvePrivacyRequests-BDG82nlp.mjs} +2 -2
  5. package/dist/{approvePrivacyRequests-DmQY27tf.mjs.map → approvePrivacyRequests-BDG82nlp.mjs.map} +1 -1
  6. package/dist/bin/bash-complete.mjs +1 -1
  7. package/dist/bin/cli.mjs +1 -1
  8. package/dist/bin/deprecated-command.mjs +1 -1
  9. package/dist/{buildExamples-COM0o0UR.mjs → buildExamples-B6BdW0FD.mjs} +2 -2
  10. package/dist/{buildExamples-COM0o0UR.mjs.map → buildExamples-B6BdW0FD.mjs.map} +1 -1
  11. package/dist/{buildXdiSyncEndpoint-5tSouA2b.mjs → buildXdiSyncEndpoint-FExEagKc.mjs} +2 -2
  12. package/dist/{buildXdiSyncEndpoint-5tSouA2b.mjs.map → buildXdiSyncEndpoint-FExEagKc.mjs.map} +1 -1
  13. package/dist/{bulkRestartRequests-CZrXs34U.mjs → bulkRestartRequests-OKwKXc52.mjs} +2 -2
  14. package/dist/{bulkRestartRequests-CZrXs34U.mjs.map → bulkRestartRequests-OKwKXc52.mjs.map} +1 -1
  15. package/dist/{bulkRetryEnrichers-BOXW2gK0.mjs → bulkRetryEnrichers-Dl-n8AFF.mjs} +2 -2
  16. package/dist/{bulkRetryEnrichers-BOXW2gK0.mjs.map → bulkRetryEnrichers-Dl-n8AFF.mjs.map} +1 -1
  17. package/dist/{cancelPrivacyRequests-CA8X4g4A.mjs → cancelPrivacyRequests-BIgX5SDz.mjs} +2 -2
  18. package/dist/{cancelPrivacyRequests-CA8X4g4A.mjs.map → cancelPrivacyRequests-BIgX5SDz.mjs.map} +1 -1
  19. package/dist/{codecs-CTxFjCg4.mjs → codecs-CfcaFoZR.mjs} +1 -1
  20. package/dist/{codecs-CTxFjCg4.mjs.map → codecs-CfcaFoZR.mjs.map} +1 -1
  21. package/dist/{collectCsvFilesOrExit-B1VOVGWN.mjs → collectCsvFilesOrExit-BindZ0dF.mjs} +1 -1
  22. package/dist/{collectCsvFilesOrExit-B1VOVGWN.mjs.map → collectCsvFilesOrExit-BindZ0dF.mjs.map} +1 -1
  23. package/dist/{collectParquetFilesOrExit-DVlv5ctt.mjs → collectParquetFilesOrExit-CbNQ9CJc.mjs} +1 -1
  24. package/dist/{collectParquetFilesOrExit-DVlv5ctt.mjs.map → collectParquetFilesOrExit-CbNQ9CJc.mjs.map} +1 -1
  25. package/dist/command-X7lkPELf.mjs +9 -0
  26. package/dist/command-X7lkPELf.mjs.map +1 -0
  27. package/dist/command-output-BJcDRXNr.mjs +2 -0
  28. package/dist/command-output-BJcDRXNr.mjs.map +1 -0
  29. package/dist/command-output-BRfF3YFv.mjs +2 -0
  30. package/dist/command-output-BRfF3YFv.mjs.map +1 -0
  31. package/dist/commands/admin/chunk-csv/worker.mjs +1 -1
  32. package/dist/commands/admin/parquet-to-csv/worker.mjs +1 -1
  33. package/dist/{consentManagersToBusinessEntities-CBJ81aGO.mjs → consentManagersToBusinessEntities-DG0_eby5.mjs} +1 -1
  34. package/dist/{consentManagersToBusinessEntities-CBJ81aGO.mjs.map → consentManagersToBusinessEntities-DG0_eby5.mjs.map} +1 -1
  35. package/dist/constants-BRsj50Nb.mjs +2 -0
  36. package/dist/{constants-XH8NIJGC.mjs.map → constants-BRsj50Nb.mjs.map} +1 -1
  37. package/dist/{constants-DXzsg2CQ.mjs → constants-DC_bBO09.mjs} +3 -3
  38. package/dist/{constants-DXzsg2CQ.mjs.map → constants-DC_bBO09.mjs.map} +1 -1
  39. package/dist/{constants-D_HVDaOy.mjs → constants-qvGk0wlN.mjs} +1 -1
  40. package/dist/{constants-D_HVDaOy.mjs.map → constants-qvGk0wlN.mjs.map} +1 -1
  41. package/dist/{context-B33NT3ki.mjs → context-D0A0LxsP.mjs} +1 -1
  42. package/dist/{context-B33NT3ki.mjs.map → context-D0A0LxsP.mjs.map} +1 -1
  43. package/dist/{createPoolingCommandUi-BtyIMQcK.mjs → createPoolingCommandUi-CyPZ3GqN.mjs} +5 -5
  44. package/dist/{createPoolingCommandUi-BtyIMQcK.mjs.map → createPoolingCommandUi-CyPZ3GqN.mjs.map} +1 -1
  45. package/dist/{dataFlowsToDataSilos-BF6fzWcm.mjs → dataFlowsToDataSilos-CRqbNjZ0.mjs} +1 -1
  46. package/dist/{dataFlowsToDataSilos-BF6fzWcm.mjs.map → dataFlowsToDataSilos-CRqbNjZ0.mjs.map} +1 -1
  47. package/dist/deno-runtime-CB2HBach.mjs +2 -0
  48. package/dist/deno-runtime-CB2HBach.mjs.map +1 -0
  49. package/dist/{done-input-validation-BUz-aVC5.mjs → done-input-validation-LiTaCEzF.mjs} +1 -1
  50. package/dist/{done-input-validation-BUz-aVC5.mjs.map → done-input-validation-LiTaCEzF.mjs.map} +1 -1
  51. package/dist/{downloadPrivacyRequestFiles-DbZjPjHw.mjs → downloadPrivacyRequestFiles-EBySRnvd.mjs} +2 -2
  52. package/dist/{downloadPrivacyRequestFiles-DbZjPjHw.mjs.map → downloadPrivacyRequestFiles-EBySRnvd.mjs.map} +1 -1
  53. package/dist/{extractClientError-HZ2U7yqV.mjs → extractClientError-DUJxHv07.mjs} +1 -1
  54. package/dist/{extractClientError-HZ2U7yqV.mjs.map → extractClientError-DUJxHv07.mjs.map} +1 -1
  55. package/dist/{fetchAllRequests-2TZr-LfT.mjs → fetchAllRequests-BI0tFl_a.mjs} +2 -2
  56. package/dist/{fetchAllRequests-2TZr-LfT.mjs.map → fetchAllRequests-BI0tFl_a.mjs.map} +1 -1
  57. package/dist/{formatPolicyBundleVersionSummary-CJmMCLtJ.mjs → formatPolicyBundleVersionSummary-DCHl1Vhy.mjs} +1 -1
  58. package/dist/{formatPolicyBundleVersionSummary-CJmMCLtJ.mjs.map → formatPolicyBundleVersionSummary-DCHl1Vhy.mjs.map} +1 -1
  59. package/dist/{fuzzyMatchColumns-CQCzpjWC.mjs → fuzzyMatchColumns-2NmQqCZI.mjs} +2 -2
  60. package/dist/{fuzzyMatchColumns-CQCzpjWC.mjs.map → fuzzyMatchColumns-2NmQqCZI.mjs.map} +1 -1
  61. package/dist/{generateCrossAccountApiKeys-C1iD6Las.mjs → generateCrossAccountApiKeys-pWTrIUE6.mjs} +2 -2
  62. package/dist/{generateCrossAccountApiKeys-C1iD6Las.mjs.map → generateCrossAccountApiKeys-pWTrIUE6.mjs.map} +1 -1
  63. package/dist/impl-0-_oxvck.mjs +2 -0
  64. package/dist/impl-0-_oxvck.mjs.map +1 -0
  65. package/dist/{impl-CNgOWzOX.mjs → impl-1SsreZWo.mjs} +2 -2
  66. package/dist/{impl-CNgOWzOX.mjs.map → impl-1SsreZWo.mjs.map} +1 -1
  67. package/dist/{impl-BjoGaK1M.mjs → impl-7rdGuHOC.mjs} +2 -2
  68. package/dist/{impl-BjoGaK1M.mjs.map → impl-7rdGuHOC.mjs.map} +1 -1
  69. package/dist/{impl-DRpK-QLC.mjs → impl-ApZGIx6l.mjs} +2 -2
  70. package/dist/{impl-DRpK-QLC.mjs.map → impl-ApZGIx6l.mjs.map} +1 -1
  71. package/dist/{impl-DVeGQCrr.mjs → impl-Ay6JeH-7.mjs} +2 -2
  72. package/dist/{impl-DVeGQCrr.mjs.map → impl-Ay6JeH-7.mjs.map} +1 -1
  73. package/dist/{impl-BR4ReYFA.mjs → impl-B2ZXtnpX.mjs} +2 -2
  74. package/dist/{impl-BR4ReYFA.mjs.map → impl-B2ZXtnpX.mjs.map} +1 -1
  75. package/dist/impl-B440iuvL.mjs +3 -0
  76. package/dist/impl-B440iuvL.mjs.map +1 -0
  77. package/dist/{impl-v_P8hszk2.mjs → impl-B7l4bLG5.mjs} +2 -2
  78. package/dist/impl-B7l4bLG5.mjs.map +1 -0
  79. package/dist/{impl-BPoEH3Nf2.mjs → impl-B94dMG4x2.mjs} +2 -2
  80. package/dist/{impl-BPoEH3Nf2.mjs.map → impl-B94dMG4x2.mjs.map} +1 -1
  81. package/dist/{impl-DXowiNOz.mjs → impl-BH1fCPDh.mjs} +2 -2
  82. package/dist/{impl-DXowiNOz.mjs.map → impl-BH1fCPDh.mjs.map} +1 -1
  83. package/dist/{impl-CfvxD3RI.mjs → impl-BLOhoP-b2.mjs} +2 -2
  84. package/dist/impl-BLOhoP-b2.mjs.map +1 -0
  85. package/dist/{impl-CMxliF19.mjs → impl-BLQDgwxL.mjs} +2 -2
  86. package/dist/{impl-CMxliF19.mjs.map → impl-BLQDgwxL.mjs.map} +1 -1
  87. package/dist/{impl-Dqqb0lVN.mjs → impl-BWPPVXG3.mjs} +3 -3
  88. package/dist/{impl-Dqqb0lVN.mjs.map → impl-BWPPVXG3.mjs.map} +1 -1
  89. package/dist/{impl-DceiaFcK.mjs → impl-BdTxFv63.mjs} +2 -2
  90. package/dist/{impl-DceiaFcK.mjs.map → impl-BdTxFv63.mjs.map} +1 -1
  91. package/dist/impl-BpVe6fMe.mjs +3 -0
  92. package/dist/{impl--JGnR3wp.mjs.map → impl-BpVe6fMe.mjs.map} +1 -1
  93. package/dist/impl-BqTMPbwc2.mjs +2 -0
  94. package/dist/impl-BqTMPbwc2.mjs.map +1 -0
  95. package/dist/impl-CAoIp9Nl2.mjs +3 -0
  96. package/dist/impl-CAoIp9Nl2.mjs.map +1 -0
  97. package/dist/{impl-99xoQXHW.mjs → impl-CU38kdj8.mjs} +2 -2
  98. package/dist/{impl-99xoQXHW.mjs.map → impl-CU38kdj8.mjs.map} +1 -1
  99. package/dist/{impl-DxnrCWeR2.mjs → impl-CWP6AXSb.mjs} +2 -2
  100. package/dist/impl-CWP6AXSb.mjs.map +1 -0
  101. package/dist/impl-CY8C-Fvj2.mjs +2 -0
  102. package/dist/impl-CY8C-Fvj2.mjs.map +1 -0
  103. package/dist/{impl-CfPDnai_.mjs → impl-C_Ifcb00.mjs} +2 -2
  104. package/dist/{impl-CfPDnai_.mjs.map → impl-C_Ifcb00.mjs.map} +1 -1
  105. package/dist/{impl-CPSEzCc9.mjs → impl-Cb42aI60.mjs} +2 -2
  106. package/dist/{impl-CPSEzCc9.mjs.map → impl-Cb42aI60.mjs.map} +1 -1
  107. package/dist/impl-Cee7Q1Ne.mjs +2 -0
  108. package/dist/impl-Cee7Q1Ne.mjs.map +1 -0
  109. package/dist/impl-CieztjdM.mjs +2 -0
  110. package/dist/impl-CieztjdM.mjs.map +1 -0
  111. package/dist/{impl-DqhZR11m.mjs → impl-ClqrQo1M.mjs} +2 -2
  112. package/dist/{impl-DqhZR11m.mjs.map → impl-ClqrQo1M.mjs.map} +1 -1
  113. package/dist/impl-CnHfn7rr.mjs +5 -0
  114. package/dist/{impl-DPtx5iZO.mjs.map → impl-CnHfn7rr.mjs.map} +1 -1
  115. package/dist/{impl-jJnYd4tJ.mjs → impl-CrdqsTUy.mjs} +2 -2
  116. package/dist/{impl-jJnYd4tJ.mjs.map → impl-CrdqsTUy.mjs.map} +1 -1
  117. package/dist/{impl-DzUTmaID2.mjs → impl-CsaT3aM2.mjs} +2 -2
  118. package/dist/impl-CsaT3aM2.mjs.map +1 -0
  119. package/dist/{impl-DB8Kt2qF2.mjs → impl-CspH2ZWx.mjs} +2 -2
  120. package/dist/impl-CspH2ZWx.mjs.map +1 -0
  121. package/dist/{impl-H9kweQnu2.mjs → impl-CudSYx-g.mjs} +2 -2
  122. package/dist/impl-CudSYx-g.mjs.map +1 -0
  123. package/dist/{impl-DUBsZL5O.mjs → impl-Cxprr2hw.mjs} +2 -2
  124. package/dist/{impl-DUBsZL5O.mjs.map → impl-Cxprr2hw.mjs.map} +1 -1
  125. package/dist/{impl-C5Mq4wv0.mjs → impl-D-a5xGld.mjs} +2 -2
  126. package/dist/{impl-C5Mq4wv0.mjs.map → impl-D-a5xGld.mjs.map} +1 -1
  127. package/dist/{impl-CGioITgZ.mjs → impl-D1UogVAq.mjs} +2 -2
  128. package/dist/{impl-CGioITgZ.mjs.map → impl-D1UogVAq.mjs.map} +1 -1
  129. package/dist/{impl-B37wtYBz.mjs → impl-D1f9mJL_.mjs} +2 -2
  130. package/dist/{impl-B37wtYBz.mjs.map → impl-D1f9mJL_.mjs.map} +1 -1
  131. package/dist/{impl-Cl9ndadE.mjs → impl-DJcNhpbx.mjs} +2 -2
  132. package/dist/{impl-Cl9ndadE.mjs.map → impl-DJcNhpbx.mjs.map} +1 -1
  133. package/dist/impl-DQG1pMzD2.mjs +2 -0
  134. package/dist/impl-DQG1pMzD2.mjs.map +1 -0
  135. package/dist/impl-DQcgEx7V2.mjs +298 -0
  136. package/dist/impl-DQcgEx7V2.mjs.map +1 -0
  137. package/dist/impl-DRKPx_I9.mjs +2 -0
  138. package/dist/impl-DRKPx_I9.mjs.map +1 -0
  139. package/dist/{impl-CXQ3OYR9.mjs → impl-DTadLabu.mjs} +2 -2
  140. package/dist/{impl-CXQ3OYR9.mjs.map → impl-DTadLabu.mjs.map} +1 -1
  141. package/dist/{impl-B9lSnjby.mjs → impl-DXbxO2VJ.mjs} +2 -2
  142. package/dist/{impl-B9lSnjby.mjs.map → impl-DXbxO2VJ.mjs.map} +1 -1
  143. package/dist/{impl-Cel22rUg2.mjs → impl-DcL-8NEa2.mjs} +2 -2
  144. package/dist/{impl-Cel22rUg2.mjs.map → impl-DcL-8NEa2.mjs.map} +1 -1
  145. package/dist/{impl-DKepRc812.mjs → impl-DeCRXfAh2.mjs} +2 -2
  146. package/dist/{impl-DKepRc812.mjs.map → impl-DeCRXfAh2.mjs.map} +1 -1
  147. package/dist/impl-DezV3QMo.mjs +3 -0
  148. package/dist/impl-DezV3QMo.mjs.map +1 -0
  149. package/dist/{impl-COujMWgp.mjs → impl-Dg7XSQdO2.mjs} +2 -2
  150. package/dist/impl-Dg7XSQdO2.mjs.map +1 -0
  151. package/dist/{impl-a_Y8bnSn.mjs → impl-DhXzxQDN2.mjs} +5 -5
  152. package/dist/impl-DhXzxQDN2.mjs.map +1 -0
  153. package/dist/impl-DiwxYcux.mjs +2 -0
  154. package/dist/{impl-BKmibZoG.mjs.map → impl-DiwxYcux.mjs.map} +1 -1
  155. package/dist/{impl-p_M16BEd.mjs → impl-Do2TNA3-.mjs} +2 -2
  156. package/dist/{impl-p_M16BEd.mjs.map → impl-Do2TNA3-.mjs.map} +1 -1
  157. package/dist/{impl-DaH1_ZzK.mjs → impl-DqHEIzpj.mjs} +2 -2
  158. package/dist/{impl-DaH1_ZzK.mjs.map → impl-DqHEIzpj.mjs.map} +1 -1
  159. package/dist/{impl-GH9uVaGu.mjs → impl-Dr_l_SLd.mjs} +2 -2
  160. package/dist/{impl-GH9uVaGu.mjs.map → impl-Dr_l_SLd.mjs.map} +1 -1
  161. package/dist/{impl-Dt5Iik_-.mjs → impl-Ds-gQfdc.mjs} +2 -2
  162. package/dist/{impl-Dt5Iik_-.mjs.map → impl-Ds-gQfdc.mjs.map} +1 -1
  163. package/dist/{impl-CJML1Gwo.mjs → impl-DtnYcktN.mjs} +2 -2
  164. package/dist/{impl-CJML1Gwo.mjs.map → impl-DtnYcktN.mjs.map} +1 -1
  165. package/dist/impl-DtpgD_as.mjs +2 -0
  166. package/dist/{impl-DWD4fAPO.mjs.map → impl-DtpgD_as.mjs.map} +1 -1
  167. package/dist/{impl-CL0y3SFr.mjs → impl-DxQ9yj3H.mjs} +2 -2
  168. package/dist/{impl-CL0y3SFr.mjs.map → impl-DxQ9yj3H.mjs.map} +1 -1
  169. package/dist/impl-FerHBNJx2.mjs +4 -0
  170. package/dist/{impl-BFn-S-Wy2.mjs.map → impl-FerHBNJx2.mjs.map} +1 -1
  171. package/dist/{impl-Cs1z9k1h2.mjs → impl-HUfaARep.mjs} +2 -2
  172. package/dist/impl-HUfaARep.mjs.map +1 -0
  173. package/dist/impl-btKJ1-VJ.mjs +3 -0
  174. package/dist/impl-btKJ1-VJ.mjs.map +1 -0
  175. package/dist/impl-eeS2lVi5.mjs +2 -0
  176. package/dist/impl-eeS2lVi5.mjs.map +1 -0
  177. package/dist/impl-iD6Fknfe.mjs +2 -0
  178. package/dist/impl-iD6Fknfe.mjs.map +1 -0
  179. package/dist/impl-ijoNwhGI.mjs +2 -0
  180. package/dist/impl-ijoNwhGI.mjs.map +1 -0
  181. package/dist/{impl-C83WRl40.mjs → impl-vmLq6HCI.mjs} +2 -2
  182. package/dist/{impl-C83WRl40.mjs.map → impl-vmLq6HCI.mjs.map} +1 -1
  183. package/dist/{impl-C8vx7N5j.mjs → impl-wBcVYHlA.mjs} +2 -2
  184. package/dist/{impl-C8vx7N5j.mjs.map → impl-wBcVYHlA.mjs.map} +1 -1
  185. package/dist/index.d.mts +2 -2
  186. package/dist/index.mjs +2 -2
  187. package/dist/index.mjs.map +1 -1
  188. package/dist/{initializeCliRuntime-6wI_VIHV.mjs → initializeCliRuntime-BaATMO1X.mjs} +1 -1
  189. package/dist/{initializeCliRuntime-6wI_VIHV.mjs.map → initializeCliRuntime-BaATMO1X.mjs.map} +1 -1
  190. package/dist/{inquirer-BeaBetMO.mjs → inquirer-BU5IpgA8.mjs} +2 -2
  191. package/dist/{inquirer-BeaBetMO.mjs.map → inquirer-BU5IpgA8.mjs.map} +1 -1
  192. package/dist/{jsonc-D9dDWb1J.mjs → jsonc-CdTubr53.mjs} +1 -1
  193. package/dist/{jsonc-D9dDWb1J.mjs.map → jsonc-CdTubr53.mjs.map} +1 -1
  194. package/dist/{listFiles-BdFUbX5x.mjs → listFiles-DDGCBdtx.mjs} +1 -1
  195. package/dist/{listFiles-BdFUbX5x.mjs.map → listFiles-DDGCBdtx.mjs.map} +1 -1
  196. package/dist/logger-CPu6zbyQ.mjs +2 -0
  197. package/dist/logger-CPu6zbyQ.mjs.map +1 -0
  198. package/dist/{mapConsentCsvRowsToInputs-Dqb6WL4r.mjs → mapConsentCsvRowsToInputs-CkLfxaIf.mjs} +1 -1
  199. package/dist/{mapConsentCsvRowsToInputs-Dqb6WL4r.mjs.map → mapConsentCsvRowsToInputs-CkLfxaIf.mjs.map} +1 -1
  200. package/dist/{markRequestDataSiloIdsCompleted-B5JCHcqh.mjs → markRequestDataSiloIdsCompleted-BYNMCkhy.mjs} +2 -2
  201. package/dist/{markRequestDataSiloIdsCompleted-B5JCHcqh.mjs.map → markRequestDataSiloIdsCompleted-BYNMCkhy.mjs.map} +1 -1
  202. package/dist/{markSilentPrivacyRequests-BAIZ97iB.mjs → markSilentPrivacyRequests-gKYivzH1.mjs} +2 -2
  203. package/dist/{markSilentPrivacyRequests-BAIZ97iB.mjs.map → markSilentPrivacyRequests-gKYivzH1.mjs.map} +1 -1
  204. package/dist/{mergeTranscendInputs-DFQcbh8b.mjs → mergeTranscendInputs-D1CvxQu0.mjs} +2 -2
  205. package/dist/{mergeTranscendInputs-DFQcbh8b.mjs.map → mergeTranscendInputs-D1CvxQu0.mjs.map} +1 -1
  206. package/dist/missing-manifest-D8y1VL4p.mjs +2 -0
  207. package/dist/missing-manifest-D8y1VL4p.mjs.map +1 -0
  208. package/dist/{module-graph-Cb0g74Ft.mjs → module-graph-CAT8_JCG.mjs} +1 -1
  209. package/dist/{module-graph-Cb0g74Ft.mjs.map → module-graph-CAT8_JCG.mjs.map} +1 -1
  210. package/dist/{notifyPrivacyRequestsAdditionalTime-C2lUoWKP.mjs → notifyPrivacyRequestsAdditionalTime-DbERhQ1Q.mjs} +2 -2
  211. package/dist/{notifyPrivacyRequestsAdditionalTime-C2lUoWKP.mjs.map → notifyPrivacyRequestsAdditionalTime-DbERhQ1Q.mjs.map} +1 -1
  212. package/dist/{parquetToCsvOneFile-ChmPC6dL.mjs → parquetToCsvOneFile-DtbCFm08.mjs} +3 -3
  213. package/dist/{parquetToCsvOneFile-ChmPC6dL.mjs.map → parquetToCsvOneFile-DtbCFm08.mjs.map} +1 -1
  214. package/dist/{parseAttributesFromString-CO16oAlx.mjs → parseAttributesFromString-C5hJMRvt.mjs} +2 -2
  215. package/dist/{parseAttributesFromString-CO16oAlx.mjs.map → parseAttributesFromString-C5hJMRvt.mjs.map} +1 -1
  216. package/dist/{parseVariablesFromString-BOSfQ4QF.mjs → parseVariablesFromString-6TYW65LF.mjs} +1 -1
  217. package/dist/{parseVariablesFromString-BOSfQ4QF.mjs.map → parseVariablesFromString-6TYW65LF.mjs.map} +1 -1
  218. package/dist/paths-J5KScOaQ.mjs +2 -0
  219. package/dist/paths-J5KScOaQ.mjs.map +1 -0
  220. package/dist/policy-bundle-manifest-BZnBMZQq.mjs +7 -0
  221. package/dist/policy-bundle-manifest-BZnBMZQq.mjs.map +1 -0
  222. package/dist/policy-project-discovery-C29UxWwt.mjs +427 -0
  223. package/dist/policy-project-discovery-C29UxWwt.mjs.map +1 -0
  224. package/dist/{policy-runtime-BMKa-Upy.mjs → policy-runtime-6jmkXlBk.mjs} +2 -2
  225. package/dist/{policy-runtime-BMKa-Upy.mjs.map → policy-runtime-6jmkXlBk.mjs.map} +1 -1
  226. package/dist/policy-scaffold-config-BUKAyPad.mjs +76 -0
  227. package/dist/policy-scaffold-config-BUKAyPad.mjs.map +1 -0
  228. package/dist/{policyEngineCliError-DY8V-qkK.mjs → policyEngineCliError-CZrOHhLv.mjs} +1 -1
  229. package/dist/{policyEngineCliError-DY8V-qkK.mjs.map → policyEngineCliError-CZrOHhLv.mjs.map} +1 -1
  230. package/dist/{printResult-CHe3nRN4.mjs → printResult-C2K9ODeE.mjs} +3 -3
  231. package/dist/printResult-C2K9ODeE.mjs.map +1 -0
  232. package/dist/project-discovery-BkHpTXDx.mjs +2 -0
  233. package/dist/project-discovery-BkHpTXDx.mjs.map +1 -0
  234. package/dist/project-discovery-CWRjlFnC.mjs +2 -0
  235. package/dist/project-discovery-CWRjlFnC.mjs.map +1 -0
  236. package/dist/project-plan-apply-Bg_1eMX9.mjs +3 -0
  237. package/dist/{project-plan-apply-Dvndx455.mjs.map → project-plan-apply-Bg_1eMX9.mjs.map} +1 -1
  238. package/dist/project-plan-output-BHHlkLxe.mjs +4 -0
  239. package/dist/project-plan-output-BHHlkLxe.mjs.map +1 -0
  240. package/dist/prompts-BhXfYD6g.mjs +2 -0
  241. package/dist/prompts-BhXfYD6g.mjs.map +1 -0
  242. package/dist/{pullAllDatapoints-uk5ggk6O.mjs → pullAllDatapoints-Bm-Orhse.mjs} +2 -2
  243. package/dist/{pullAllDatapoints-uk5ggk6O.mjs.map → pullAllDatapoints-Bm-Orhse.mjs.map} +1 -1
  244. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-BmhJiquf.mjs → pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs} +2 -2
  245. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-BmhJiquf.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs.map} +1 -1
  246. package/dist/{pullConsentManagerMetrics-Dv5n1ZGp.mjs → pullConsentManagerMetrics-DKCkfbCB.mjs} +2 -2
  247. package/dist/{pullConsentManagerMetrics-Dv5n1ZGp.mjs.map → pullConsentManagerMetrics-DKCkfbCB.mjs.map} +1 -1
  248. package/dist/{pullManualEnrichmentIdentifiersToCsv-BbQc9MDM.mjs → pullManualEnrichmentIdentifiersToCsv-DMC5CQtE.mjs} +2 -2
  249. package/dist/{pullManualEnrichmentIdentifiersToCsv-BbQc9MDM.mjs.map → pullManualEnrichmentIdentifiersToCsv-DMC5CQtE.mjs.map} +1 -1
  250. package/dist/{pullTranscendConfiguration-B63M3ild.mjs → pullTranscendConfiguration-CDUDqxpm.mjs} +2 -2
  251. package/dist/{pullTranscendConfiguration-B63M3ild.mjs.map → pullTranscendConfiguration-CDUDqxpm.mjs.map} +1 -1
  252. package/dist/{pullUnstructuredSubDataPointRecommendations-YTBzfkRZ.mjs → pullUnstructuredSubDataPointRecommendations-Ci4AOxyH.mjs} +2 -2
  253. package/dist/{pullUnstructuredSubDataPointRecommendations-YTBzfkRZ.mjs.map → pullUnstructuredSubDataPointRecommendations-Ci4AOxyH.mjs.map} +1 -1
  254. package/dist/{pushCronIdentifiersFromCsv-Cfo2GibV.mjs → pushCronIdentifiersFromCsv-DhS2z8IG.mjs} +2 -2
  255. package/dist/{pushCronIdentifiersFromCsv-Cfo2GibV.mjs.map → pushCronIdentifiersFromCsv-DhS2z8IG.mjs.map} +1 -1
  256. package/dist/{pushManualEnrichmentIdentifiersFromCsv-DokcIxh1.mjs → pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs} +2 -2
  257. package/dist/{pushManualEnrichmentIdentifiersFromCsv-DokcIxh1.mjs.map → pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs.map} +1 -1
  258. package/dist/{readCsv-DLg8pwjd.mjs → readCsv-DNcJ_UfU.mjs} +1 -1
  259. package/dist/{readCsv-DLg8pwjd.mjs.map → readCsv-DNcJ_UfU.mjs.map} +1 -1
  260. package/dist/{readTranscendYaml-BNn6-Ofi.mjs → readTranscendYaml-BfqQbPiT.mjs} +3 -3
  261. package/dist/{readTranscendYaml-BNn6-Ofi.mjs.map → readTranscendYaml-BfqQbPiT.mjs.map} +1 -1
  262. package/dist/{removeUnverifiedRequestIdentifiers-p4gFagI0.mjs → removeUnverifiedRequestIdentifiers-BkAcUZZN.mjs} +2 -2
  263. package/dist/{removeUnverifiedRequestIdentifiers-p4gFagI0.mjs.map → removeUnverifiedRequestIdentifiers-BkAcUZZN.mjs.map} +1 -1
  264. package/dist/{renderTable-D68QasPc.mjs → renderTable-CZP2roD1.mjs} +1 -1
  265. package/dist/{renderTable-D68QasPc.mjs.map → renderTable-CZP2roD1.mjs.map} +1 -1
  266. package/dist/{request-BiPv6jmP.mjs → request-BpKyN9Xm.mjs} +1 -1
  267. package/dist/{request-BiPv6jmP.mjs.map → request-BpKyN9Xm.mjs.map} +1 -1
  268. package/dist/{resolveBundleIdByName-qXZBrUz_.mjs → resolveBundleIdByName-Dm_o5_bg.mjs} +2 -2
  269. package/dist/{resolveBundleIdByName-qXZBrUz_.mjs.map → resolveBundleIdByName-Dm_o5_bg.mjs.map} +1 -1
  270. package/dist/{resolvePolicyBundleVersion-BG7XqBBP.mjs → resolvePolicyBundleVersion-DRUwe7fA.mjs} +2 -2
  271. package/dist/{resolvePolicyBundleVersion-BG7XqBBP.mjs.map → resolvePolicyBundleVersion-DRUwe7fA.mjs.map} +1 -1
  272. package/dist/{retryRequestDataSilos-C6mvi-ET.mjs → retryRequestDataSilos-BoPmcB8-.mjs} +2 -2
  273. package/dist/{retryRequestDataSilos-C6mvi-ET.mjs.map → retryRequestDataSilos-BoPmcB8-.mjs.map} +1 -1
  274. package/dist/{run-captured-process-BXwWXuTh.mjs → run-captured-process-BjaSDWXG.mjs} +1 -1
  275. package/dist/{run-captured-process-BXwWXuTh.mjs.map → run-captured-process-BjaSDWXG.mjs.map} +1 -1
  276. package/dist/{runOpa-CswzJxIs.mjs → runOpa-ojIqU1tO.mjs} +2 -2
  277. package/dist/{runOpa-CswzJxIs.mjs.map → runOpa-ojIqU1tO.mjs.map} +1 -1
  278. package/dist/{scaffold-model-BAbYTR0q.mjs → scaffold-model-CUZER0BC.mjs} +1 -1
  279. package/dist/scaffold-model-CUZER0BC.mjs.map +1 -0
  280. package/dist/{scaffold-planning-CNv83t_v.mjs → scaffold-planning-CaetLfv8.mjs} +9 -9
  281. package/dist/{scaffold-planning-CNv83t_v.mjs.map → scaffold-planning-CaetLfv8.mjs.map} +1 -1
  282. package/dist/{scaffold-templates-DzDGTZie.mjs → scaffold-templates-CUL82Zf8.mjs} +1 -1
  283. package/dist/{scaffold-templates-DzDGTZie.mjs.map → scaffold-templates-CUL82Zf8.mjs.map} +1 -1
  284. package/dist/{skipPreflightJobs-CgUcTgzf.mjs → skipPreflightJobs-DkBdYw-r.mjs} +2 -2
  285. package/dist/{skipPreflightJobs-CgUcTgzf.mjs.map → skipPreflightJobs-DkBdYw-r.mjs.map} +1 -1
  286. package/dist/{skipRequestDataSilos-Be-6OhWe.mjs → skipRequestDataSilos-BRFiokix.mjs} +2 -2
  287. package/dist/{skipRequestDataSilos-Be-6OhWe.mjs.map → skipRequestDataSilos-BRFiokix.mjs.map} +1 -1
  288. package/dist/{streamPrivacyRequestsToCsv-BaeFrrGF.mjs → streamPrivacyRequestsToCsv-Bt-H5J-y.mjs} +2 -2
  289. package/dist/{streamPrivacyRequestsToCsv-BaeFrrGF.mjs.map → streamPrivacyRequestsToCsv-Bt-H5J-y.mjs.map} +1 -1
  290. package/dist/{syncCodePackages-BHE2Tn1Q.mjs → syncCodePackages-CPkEukDm.mjs} +2 -2
  291. package/dist/{syncCodePackages-BHE2Tn1Q.mjs.map → syncCodePackages-CPkEukDm.mjs.map} +1 -1
  292. package/dist/{updateConsentManagerVersionToLatest-3mQX2U8F.mjs → updateConsentManagerVersionToLatest-DWblAwus.mjs} +2 -2
  293. package/dist/{updateConsentManagerVersionToLatest-3mQX2U8F.mjs.map → updateConsentManagerVersionToLatest-DWblAwus.mjs.map} +1 -1
  294. package/dist/{uploadConsents-Dnbtx9P5.mjs → uploadConsents-D7Vg8ZRW.mjs} +2 -2
  295. package/dist/{uploadConsents-Dnbtx9P5.mjs.map → uploadConsents-D7Vg8ZRW.mjs.map} +1 -1
  296. package/dist/{uploadPrivacyRequestsFromCsv-BIW2JPjA.mjs → uploadPrivacyRequestsFromCsv-B_hQwIn6.mjs} +2 -2
  297. package/dist/{uploadPrivacyRequestsFromCsv-BIW2JPjA.mjs.map → uploadPrivacyRequestsFromCsv-B_hQwIn6.mjs.map} +1 -1
  298. package/dist/validateTranscendAuth-D-dDINof.mjs +2 -0
  299. package/dist/{validateTranscendAuth-D6Wr1cxY.mjs.map → validateTranscendAuth-D-dDINof.mjs.map} +1 -1
  300. package/dist/{writeCsv-D-2siSwE.mjs → writeCsv-CNZrq3zU.mjs} +1 -1
  301. package/dist/{writeCsv-D-2siSwE.mjs.map → writeCsv-CNZrq3zU.mjs.map} +1 -1
  302. package/package.json +6 -5
  303. package/dist/app-D-IPyX64.mjs +0 -148
  304. package/dist/app-D-IPyX64.mjs.map +0 -1
  305. package/dist/command-Ddx7b9ik.mjs +0 -9
  306. package/dist/command-Ddx7b9ik.mjs.map +0 -1
  307. package/dist/constants-XH8NIJGC.mjs +0 -2
  308. package/dist/deno-runtime-DV52X8-P.mjs +0 -2
  309. package/dist/deno-runtime-DV52X8-P.mjs.map +0 -1
  310. package/dist/impl--JGnR3wp.mjs +0 -3
  311. package/dist/impl-7UqkSO3x2.mjs +0 -2
  312. package/dist/impl-7UqkSO3x2.mjs.map +0 -1
  313. package/dist/impl-B4BgGuF_.mjs +0 -3
  314. package/dist/impl-B4BgGuF_.mjs.map +0 -1
  315. package/dist/impl-BFn-S-Wy2.mjs +0 -4
  316. package/dist/impl-BKmibZoG.mjs +0 -2
  317. package/dist/impl-C6HtWd1t.mjs +0 -2
  318. package/dist/impl-C6HtWd1t.mjs.map +0 -1
  319. package/dist/impl-CO4ZqlLV.mjs +0 -3
  320. package/dist/impl-CO4ZqlLV.mjs.map +0 -1
  321. package/dist/impl-COujMWgp.mjs.map +0 -1
  322. package/dist/impl-CUOVJsRg.mjs +0 -3
  323. package/dist/impl-CUOVJsRg.mjs.map +0 -1
  324. package/dist/impl-CUiYbk6G.mjs +0 -3
  325. package/dist/impl-CUiYbk6G.mjs.map +0 -1
  326. package/dist/impl-CbAvM_1J.mjs +0 -2
  327. package/dist/impl-CbAvM_1J.mjs.map +0 -1
  328. package/dist/impl-CfvxD3RI.mjs.map +0 -1
  329. package/dist/impl-Cli2XRp02.mjs +0 -2
  330. package/dist/impl-Cli2XRp02.mjs.map +0 -1
  331. package/dist/impl-Cs1z9k1h2.mjs.map +0 -1
  332. package/dist/impl-DB8Kt2qF2.mjs.map +0 -1
  333. package/dist/impl-DHQh34Eh2.mjs +0 -303
  334. package/dist/impl-DHQh34Eh2.mjs.map +0 -1
  335. package/dist/impl-DN6CgOI6.mjs +0 -2
  336. package/dist/impl-DN6CgOI6.mjs.map +0 -1
  337. package/dist/impl-DPtx5iZO.mjs +0 -5
  338. package/dist/impl-DWD4fAPO.mjs +0 -2
  339. package/dist/impl-DXRDWiB1.mjs +0 -2
  340. package/dist/impl-DXRDWiB1.mjs.map +0 -1
  341. package/dist/impl-DdIa0zla.mjs +0 -2
  342. package/dist/impl-DdIa0zla.mjs.map +0 -1
  343. package/dist/impl-DryC3OJu.mjs +0 -2
  344. package/dist/impl-DryC3OJu.mjs.map +0 -1
  345. package/dist/impl-DxnrCWeR2.mjs.map +0 -1
  346. package/dist/impl-DzUTmaID2.mjs.map +0 -1
  347. package/dist/impl-H9kweQnu2.mjs.map +0 -1
  348. package/dist/impl-Z8oWVENM.mjs +0 -2
  349. package/dist/impl-Z8oWVENM.mjs.map +0 -1
  350. package/dist/impl-a_Y8bnSn.mjs.map +0 -1
  351. package/dist/impl-v_P8hszk2.mjs.map +0 -1
  352. package/dist/logger-zplFSeXU.mjs +0 -2
  353. package/dist/logger-zplFSeXU.mjs.map +0 -1
  354. package/dist/manifest-BNIpO_zW.mjs +0 -2
  355. package/dist/manifest-BNIpO_zW.mjs.map +0 -1
  356. package/dist/missing-manifest-DgcukXfg.mjs +0 -2
  357. package/dist/missing-manifest-DgcukXfg.mjs.map +0 -1
  358. package/dist/path-safety-D5Qwl40b.mjs +0 -2
  359. package/dist/path-safety-D5Qwl40b.mjs.map +0 -1
  360. package/dist/policy-bundle-manifest-D6dkbjNi.mjs +0 -7
  361. package/dist/policy-bundle-manifest-D6dkbjNi.mjs.map +0 -1
  362. package/dist/printResult-CHe3nRN4.mjs.map +0 -1
  363. package/dist/project-plan-apply-Dvndx455.mjs +0 -3
  364. package/dist/prompts-ClBXdELk.mjs +0 -4
  365. package/dist/prompts-ClBXdELk.mjs.map +0 -1
  366. package/dist/scaffold-model-BAbYTR0q.mjs.map +0 -1
  367. package/dist/validateTranscendAuth-D6Wr1cxY.mjs +0 -2
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-D-IPyX64.mjs","names":["initCommand","pushCommand","initCommand","pushCommand","pullIdentifiersCommand","pullIdentifiersCommand"],"sources":["../src/commands/admin/chunk-csv/command.ts","../src/commands/admin/find-text-in-folder/command.ts","../src/commands/admin/generate-api-keys/command.ts","../src/commands/admin/parquet-to-csv/command.ts","../src/commands/admin/routes.ts","../src/commands/consent/build-xdi-sync-endpoint/command.ts","../src/commands/consent/delete-preference-records/command.ts","../src/commands/consent/generate-access-tokens/command.ts","../src/commands/consent/pull-consent-metrics/command.ts","../src/commands/consent/pull-consent-preferences/command.ts","../src/commands/consent/update-consent-manager/command.ts","../src/commands/consent/upload-consent-preferences/command.ts","../src/commands/consent/upload-cookies-from-csv/command.ts","../src/commands/consent/upload-data-flows-from-csv/command.ts","../src/commands/consent/upload-preferences/command.ts","../src/commands/consent/routes.ts","../src/commands/custom-functions/check/command.ts","../src/commands/custom-functions/init/command.ts","../src/commands/custom-functions/list/command.ts","../src/commands/custom-functions/new/command.ts","../src/commands/custom-functions/push/command.ts","../src/commands/custom-functions/run/command.ts","../src/commands/custom-functions/routes.ts","../src/commands/inventory/consent-manager-service-json-to-yml/command.ts","../src/commands/inventory/consent-managers-to-business-entities/command.ts","../src/commands/inventory/derive-data-silos-from-data-flows-cross-instance/command.ts","../src/commands/inventory/derive-data-silos-from-data-flows/command.ts","../src/commands/inventory/discover-silos/command.ts","../src/commands/inventory/pull-datapoints/command.ts","../src/commands/inventory/pull-unstructured-discovery-files/command.ts","../src/commands/inventory/push/command.ts","../src/commands/inventory/scan-packages/command.ts","../src/commands/inventory/routes.ts","../src/commands/migration/sync-ot/command.ts","../src/commands/migration/routes.ts","../src/commands/policy/helpers/policyCommandParameters.ts","../src/commands/policy/activate/command.ts","../src/commands/policy/helpers/parsePaginationFlags.ts","../src/commands/policy/bundles/command.ts","../src/commands/policy/deactivate/command.ts","../src/commands/policy/download/command.ts","../src/commands/policy/eval/command.ts","../src/commands/policy/init/command.ts","../src/commands/policy/lint/command.ts","../src/commands/policy/publish/command.ts","../src/commands/policy/test/command.ts","../src/commands/policy/versions/command.ts","../src/commands/policy/routes.ts","../src/commands/request/approve/command.ts","../src/commands/request/cancel/command.ts","../src/commands/request/cron/mark-identifiers-completed/command.ts","../src/commands/request/cron/pull-identifiers/command.ts","../src/commands/request/cron/pull-profiles/command.ts","../src/commands/request/cron/routes.ts","../src/commands/request/download-files/command.ts","../src/commands/request/enricher-restart/command.ts","../src/commands/request/export/command.ts","../src/commands/request/mark-silent/command.ts","../src/commands/request/notify-additional-time/command.ts","../src/commands/request/preflight/pull-identifiers/command.ts","../src/commands/request/preflight/push-identifiers/command.ts","../src/commands/request/preflight/routes.ts","../src/commands/request/reject-unverified-identifiers/command.ts","../src/commands/request/restart/command.ts","../src/commands/request/skip-preflight-jobs/command.ts","../src/commands/request/system/mark-request-data-silos-completed/command.ts","../src/commands/request/system/retry-request-data-silos/command.ts","../src/commands/request/system/skip-request-data-silos/command.ts","../src/commands/request/system/routes.ts","../src/commands/request/upload/command.ts","../src/commands/request/routes.ts","../src/app.ts"],"sourcesContent":["import { buildCommand } from '@stricli/core';\n\nexport const chunkCsvCommand = buildCommand({\n loader: async () => {\n const { chunkCsv } = await import('./impl.js');\n return chunkCsv;\n },\n parameters: {\n flags: {\n directory: {\n kind: 'parsed',\n parse: String,\n brief: 'Directory containing CSV files to split (required)',\n },\n outputDir: {\n kind: 'parsed',\n parse: String,\n brief: \"Directory to write chunk files (defaults to each input file's directory)\",\n optional: true,\n },\n clearOutputDir: {\n kind: 'boolean',\n brief: 'Clear the output directory before writing chunks',\n default: true,\n },\n chunkSizeMB: {\n kind: 'parsed',\n parse: (v: string) => {\n const n = Number(v);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error('chunkSizeMB must be a positive number');\n }\n return n;\n },\n brief: 'Approximate chunk size in megabytes. Keep well under JS string size limits',\n default: '10',\n },\n concurrency: {\n kind: 'parsed',\n parse: (v: string) => Math.max(1, Number(v) || 0),\n brief: 'Max number of worker processes (defaults based on CPU and file count)',\n optional: true,\n },\n viewerMode: {\n kind: 'boolean',\n brief: 'Run in non-interactive viewer mode (no attach UI, auto-artifacts)',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Chunk all CSVs in a directory into smaller CSV files',\n fullDescription: `Streams every CSV in --directory and writes chunked files of approximately N MB each.\n- Runs files in parallel across worker processes (configurable via --concurrency).\n- Validates row-length consistency against the header row; logs periodic progress and memory usage.`,\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const findTextInFolderCommand = buildCommand({\n loader: async () => {\n const { findTextInFolder } = await import('./impl.js');\n return findTextInFolder;\n },\n parameters: {\n flags: {\n needle: {\n kind: 'parsed',\n parse: String,\n brief: 'The text string to search for (case-insensitive)',\n },\n root: {\n kind: 'parsed',\n parse: String,\n brief: 'Root directory to search',\n default: '.',\n },\n exts: {\n kind: 'parsed',\n parse: String,\n brief: 'Comma-separated file extensions to search (without leading dots)',\n default: 'csv,json,txt,ndjson,log',\n },\n noParquet: {\n kind: 'boolean',\n brief: 'Skip parquet file scanning (requires duckdb on PATH)',\n default: false,\n },\n concurrency: {\n kind: 'parsed',\n parse: (v: string) => {\n const n = Number(v);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error('concurrency must be a positive number');\n }\n return n;\n },\n brief: 'Max number of files to scan concurrently',\n default: '16',\n },\n maxBytes: {\n kind: 'parsed',\n parse: (v: string) => {\n const n = Number(v);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error('maxBytes must be a positive number');\n }\n return n;\n },\n brief: 'Stop scanning each file after this many bytes (useful for huge files)',\n optional: true,\n },\n },\n },\n docs: {\n brief: 'Find a needle in a haystack — search many large files in a folder for a text match',\n fullDescription: `Searches a folder of files for a given text string (case-insensitive).\n\nUseful for finding a needle in a haystack when you have many large files\n(e.g. multi-GB CSV exports, JSON dumps, log archives) and need to know\nwhich ones contain a specific value like an email address, ID, or keyword.\n\nFiles are streamed so memory stays flat even for very large inputs.\nConcurrency is configurable and files are scanned in parallel.\n\nSupported file types:\n- Text-based files (csv, json, txt, ndjson, log, etc.) are scanned via streaming byte comparison.\n- Parquet files are scanned via DuckDB (must be on PATH unless --noParquet is set).\n\nOutputs one matching file path per line to stdout as hits are found.`,\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nimport { SCOPE_TITLES } from '../../../constants.js';\nimport { createTranscendUrlParameter } from '../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../lib/cli/parsers.js';\n\nexport const generateApiKeysCommand = buildCommand({\n loader: async () => {\n const { generateApiKeys } = await import('./impl.js');\n return generateApiKeys;\n },\n parameters: {\n flags: {\n email: {\n kind: 'parsed',\n parse: String,\n brief: 'The email address that you use to log into Transcend',\n },\n password: {\n kind: 'parsed',\n parse: String,\n brief: 'The password for your account login',\n },\n apiKeyTitle: {\n kind: 'parsed',\n parse: String,\n brief: 'The title of the API key being generated or destroyed',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'The file where API keys should be written to',\n },\n scopes: {\n kind: 'enum',\n values: SCOPE_TITLES,\n variadic: ',',\n brief: 'The list of scopes that should be given to the API key',\n },\n deleteExistingApiKey: {\n kind: 'boolean',\n brief:\n 'When true, if an API key exists with the specified apiKeyTitle, the existing API key is deleted',\n default: true,\n },\n createNewApiKey: {\n kind: 'boolean',\n brief:\n 'When true, new API keys will be created. Set to false if you simply want to delete all API keys with a title',\n default: true,\n },\n parentOrganizationId: {\n kind: 'parsed',\n parse: uuidParser,\n brief:\n 'Filter for only a specific organization by ID, returning all child accounts associated with that organization',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Generate API keys',\n fullDescription: `This command allows for creating API keys across multiple Transcend instances. This is useful for customers that are managing many Transcend instances and need to regularly create, cycle or delete API keys across all of their instances.\n\nUnlike the other commands that rely on API key authentication, this command relies upon username/password authentication. This command will spit out the API keys into a JSON file, and that JSON file can be used in subsequent CLI commands.\n\nAuthentication requires your email and password for the Transcend account. This command will only generate API keys for Transcend instances where you have the permission to \"Manage API Keys\".`,\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const parquetToCsvCommand = buildCommand({\n loader: async () => {\n const { parquetToCsv } = await import('./impl.js');\n return parquetToCsv;\n },\n parameters: {\n flags: {\n directory: {\n kind: 'parsed',\n parse: String,\n brief: 'Directory containing Parquet files to convert (required)',\n },\n outputDir: {\n kind: 'parsed',\n parse: String,\n brief: \"Directory to write CSV files (defaults to each input file's directory)\",\n optional: true,\n },\n clearOutputDir: {\n kind: 'boolean',\n brief: 'Clear the output directory before writing CSVs',\n default: true,\n },\n concurrency: {\n kind: 'parsed',\n parse: (v: string) => Math.max(1, Number(v) || 0),\n brief: 'Max number of worker processes (defaults based on CPU and file count)',\n optional: true,\n },\n viewerMode: {\n kind: 'boolean',\n brief: 'Run in non-interactive viewer mode (no attach UI, auto-artifacts)',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Convert all Parquet files in a directory to CSV',\n fullDescription: `Streams every .parquet in --directory and writes CSV output files\n- Runs files in parallel across worker processes (configurable via --concurrency).\n- Validates row consistency; logs periodic progress and memory usage.\n\nThis is a useful administrative tool for converting Parquet exports to CSV for the purposes\nof uploading DSRs or Consent Preferences. e.g. transcend consent upload-preferences ...`,\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { chunkCsvCommand } from './chunk-csv/command.js';\nimport { findTextInFolderCommand } from './find-text-in-folder/command.js';\nimport { generateApiKeysCommand } from './generate-api-keys/command.js';\nimport { parquetToCsvCommand } from './parquet-to-csv/command.js';\n\nexport const adminRoutes = buildRouteMap({\n routes: {\n 'generate-api-keys': generateApiKeysCommand,\n 'chunk-csv': chunkCsvCommand,\n 'find-text-in-folder': findTextInFolderCommand,\n 'parquet-to-csv': parquetToCsvCommand,\n },\n docs: {\n brief: 'Admin commands',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { arrayParser } from '../../../lib/cli/parsers.js';\n\nexport const buildXdiSyncEndpointCommand = buildCommand({\n loader: async () => {\n const { buildXdiSyncEndpoint } = await import('./impl.js');\n return buildXdiSyncEndpoint;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewConsentManager],\n }),\n xdiLocation: {\n kind: 'parsed',\n parse: String,\n brief: 'The location of the XDI that will be loaded by the generated sync endpoint',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'The HTML file path where the sync endpoint should be written',\n default: './sync-endpoint.html',\n },\n removeIpAddresses: {\n kind: 'boolean',\n brief: 'When true, remove IP addresses from the domain list',\n default: true,\n },\n domainBlockList: {\n kind: 'parsed',\n parse: arrayParser,\n brief:\n 'The set of domains that should be excluded from the sync endpoint. Comma-separated list.',\n default: 'localhost',\n },\n xdiAllowedCommands: {\n kind: 'parsed',\n parse: String,\n brief: 'The allowed set of XDI commands',\n default: 'ConsentManager:Sync',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Build XDI sync endpoint',\n fullDescription:\n 'This command allows for building of the XDI Sync Endpoint across a set of Transcend accounts.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const deletePreferenceRecordsCommand = buildCommand({\n loader: async () => {\n const { deletePreferenceRecords } = await import('./impl.js');\n return deletePreferenceRecords;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageStoredPreferences],\n }),\n sombraAuth: createSombraAuthParameter(),\n partition: {\n kind: 'parsed',\n parse: String,\n brief: 'Partition ID to used to delete preference records from',\n },\n timestamp: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'The timestamp when the deletion operation is made. Used for logging purposes.',\n },\n file: {\n kind: 'parsed',\n parse: String,\n optional: true,\n brief: 'Path to the CSV file used to identify preference records to delete',\n },\n directory: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the directory of CSV files to load preferences from',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n maxItemsInChunk: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'When chunking, how many items to delete in a single chunk (higher = faster, but more load).',\n default: '10',\n },\n maxConcurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'Number of concurrent requests to make when deleting preference records. (Higher = faster, but more load and rate limiting errors).',\n default: '10',\n },\n fileConcurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'Number of files to process concurrently when deleting preference records from multiple files.',\n default: '5',\n },\n receiptDirectory: {\n kind: 'parsed',\n parse: String,\n brief: 'Directory to write receipts of failed deletions to.',\n default: './receipts',\n },\n },\n },\n docs: {\n brief: 'Delete consent preference records in bulk from Preference Store',\n fullDescription:\n 'Uses POST /v1/preferences/{partition}/delete route on sombra to delete consent preference records in bulk ' +\n 'from Preference Store based on a CSV file input. Refer to examples/cli-upload-preferences-example.csv for the expected format of the CSV file. ' +\n 'The CSV expects the following headers: \"name\" and \"value\". ' +\n 'The \"name\" field corresponds to the identifier name as defined on https://app.transcend.io/privacy-requests/identifiers ' +\n 'The \"value\" refers to the actual identifier value for the user whose preference record is being deleted. ' +\n 'For Large scale deletions, consider chunking the input CSV into smaller files and using the --directory option to process them concurrently.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { parseDurationToMs } from '../../../lib/cli/parsers.js';\n\nexport const generateAccessTokensCommand = buildCommand({\n loader: async () => {\n const { generateAccessTokens } = await import('./impl.js');\n return generateAccessTokens;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.GeneratePreferenceAccessTokens],\n }),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file containing user identifiers to generate access tokens for',\n },\n subjectType: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Slug for the data subject that the user will be logged in as on the Privacy Center. e.g. \"customer\" or \"employee\"',\n },\n emailColumnName: {\n kind: 'parsed',\n parse: String,\n brief: 'Name of the column in the CSV that contains user email addresses',\n default: 'email',\n },\n coreIdentifierColumnName: {\n kind: 'parsed',\n parse: String,\n optional: true,\n brief: 'Name of the column in the CSV that contains user core identifiers',\n },\n duration: {\n kind: 'parsed',\n parse: parseDurationToMs,\n brief:\n 'How long the access tokens should be valid. Accepts human-friendly values ' +\n 'like \"2 days\", \"10h\", \"90 minutes\". A bare number is interpreted as seconds ' +\n '(e.g., \"300\" = 5 minutes). Powered by the `ms` library: ' +\n 'https://github.com/vercel/ms',\n // Default of \"1y\" → parsed to 31_557_600_000 ms\n default: '1y',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Generate access tokens',\n fullDescription:\n 'This command allows for the generation of access tokens for users specified in a CSV file.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const pullConsentMetricsCommand = buildCommand({\n loader: async () => {\n const { pullConsentMetrics } = await import('./impl.js');\n return pullConsentMetrics;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewConsentManager],\n }),\n start: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'The start date to pull metrics from',\n },\n end: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'The end date to pull metrics until',\n optional: true,\n },\n folder: {\n kind: 'parsed',\n parse: String,\n brief: 'The folder to save metrics to',\n default: './consent-metrics/',\n },\n bin: {\n kind: 'parsed',\n parse: String,\n brief: 'The bin metric when pulling data (1h or 1d)',\n default: '1d',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Pull consent metrics',\n fullDescription: `This command allows for pulling consent manager metrics for a Transcend account, or a set of Transcend accounts.\n\nBy default, the consent metrics will be written to a folder named \\`consent-metrics\\` within the directory where you run the command. You can override the location that these CSVs are written to using the flag \\`--folder=./my-folder/\\`. This folder will contain a set of CSV files:\n\n- \\`CONSENT_CHANGES_TIMESERIES_optIn.csv\\` -> this is a feed containing the number of explicit opt in events that happen - these are calls to \\`airgap.setConsent(event, { SaleOfInfo: true });\\`\n- \\`CONSENT_CHANGES_TIMESERIES_optOut.csv\\` -> this is a feed containing the number of explicit opt out events that happen - these are calls to \\`airgap.setConsent(event, { SaleOfInfo: false });\\`\n- \\`CONSENT_SESSIONS_BY_REGIME_Default.csv\\` -> this contains the number of sessions detected for the bin period\n- \\`PRIVACY_SIGNAL_TIMESERIES_DNT.csv\\` -> the number of DNT signals detected.\n- \\`PRIVACY_SIGNAL_TIMESERIES_GPC.csv\\` -> the number of GPC signals detected.`,\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const pullConsentPreferencesCommand = buildCommand({\n loader: async () => {\n const { pullConsentPreferences } = await import('./impl.js');\n return pullConsentPreferences;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [\n ScopeName.ViewManagedConsentDatabaseAdminApi,\n ScopeName.ViewRequestIdentitySettings,\n ScopeName.ViewPreferenceStoreSettings,\n ],\n }),\n partition: {\n kind: 'parsed',\n parse: String,\n brief: 'Partition ID to query in the Preference Store',\n },\n sombraAuth: createSombraAuthParameter(),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to CSV output file',\n default: './preferences.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n // \"timestamp*\" filters map to consent collection time\n timestampBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Filter: preferences collected before this time (timestampBefore)',\n optional: true,\n },\n timestampAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Filter: preferences collected after this time (timestampAfter)',\n optional: true,\n },\n // \"updated*\" filters map to system.updatedAt window\n updatedBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Filter: preferences updated before this time (system.updatedAt)',\n optional: true,\n },\n updatedAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Filter: preferences updated after this time (system.updatedAt)',\n optional: true,\n },\n identifiers: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief:\n 'Filter specific users by identifier(s) as \"name:value\". ' +\n 'If name is omitted, defaults to \"email\". Multiple values separated by commas.',\n optional: true,\n },\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'Page size / concurrency used when downloading (1–50 per API). Higher = fewer pages.',\n default: '50',\n },\n shouldChunk: {\n kind: 'boolean',\n brief: 'Whether to download requests in timestamp window chunks.',\n default: true,\n },\n exportIdentifiersWithDelimiter: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Delimiter to use when combining multiple identifiers into a single column in the output CSV.',\n default: ',',\n },\n windowConcurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'When chunking, how many windows to download in parallel (higher = faster, but more load).',\n default: '80',\n },\n maxChunks: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'Maximum number of chunks to download (higher = more data, but more load).',\n default: '20000',\n },\n maxLookbackDays: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'Maximum lookback period in days for fetching consent preferences.',\n default: '3650',\n },\n },\n },\n docs: {\n brief: 'Pull consent preferences from the Managed Consent Database',\n fullDescription:\n 'Uses POST /v1/preferences/{partition}/query with cursor-based pagination. ' +\n 'Supports filtering by identifiers, collection timestamps, and system.updatedAt.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ConsentBundleType, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const updateConsentManagerCommand = buildCommand({\n loader: async () => {\n const { updateConsentManager } = await import('./impl.js');\n return updateConsentManager;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageConsentManagerDeveloperSettings],\n }),\n bundleTypes: {\n kind: 'enum',\n values: Object.values(ConsentBundleType),\n brief: 'The bundle types to deploy. Defaults to PRODUCTION,TEST.',\n variadic: ',',\n },\n deploy: {\n kind: 'boolean',\n brief: 'When true, deploy the Consent Manager after updating the version',\n default: false,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Update consent manager',\n fullDescription:\n 'This command allows for updating Consent Manager to latest version. The Consent Manager bundle can also be deployed using this command.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\n\nimport { createConsentUrlParameter } from '../../../lib/cli/common-parameters.js';\n\nexport const uploadConsentPreferencesCommand = buildCommand({\n loader: async () => {\n const { uploadConsentPreferences } = await import('./impl.js');\n return uploadConsentPreferences;\n },\n parameters: {\n flags: {\n base64EncryptionKey: {\n kind: 'parsed',\n parse: String,\n brief: 'The encryption key used to encrypt the userId',\n },\n base64SigningKey: {\n kind: 'parsed',\n parse: String,\n brief: 'The signing key used to prove authentication of consent request',\n },\n partition: {\n kind: 'parsed',\n parse: String,\n brief: 'The partition key to download consent preferences to',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'The file to pull consent preferences from',\n default: './preferences.csv',\n },\n consentUrl: createConsentUrlParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '100',\n },\n },\n },\n docs: {\n brief: 'Upload consent preferences to the Managed Consent Database',\n fullDescription:\n 'This command allows for updating of consent preferences to the Managed Consent Database.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ConsentTrackerStatus, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const uploadCookiesFromCsvCommand = buildCommand({\n loader: async () => {\n const { uploadCookiesFromCsv } = await import('./impl.js');\n return uploadCookiesFromCsv;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageDataFlow],\n }),\n trackerStatus: {\n kind: 'enum',\n values: Object.values(ConsentTrackerStatus),\n brief: 'The status of the cookies you will upload.',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file to upload',\n default: './cookies.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Upload cookies from CSV',\n fullDescription: `Upload cookies from CSV. This command allows for uploading of cookies from CSV.\n\nStep 1) Download the CSV of cookies that you want to edit from the Admin Dashboard under [Consent Management -> Cookies](https://app.transcend.io/consent-manager/cookies). You can download cookies from both the \"Triage\" and \"Approved\" tabs.\n\nStep 2) You can edit the contents of the CSV file as needed. You may adjust the \"Purpose\" column, adjust the \"Notes\" column, add \"Owners\" and \"Teams\" or even add custom columns with additional metadata.\n\nStep 3) Upload the modified CSV file back into the dashboard with this command.`,\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ConsentTrackerStatus, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const uploadDataFlowsFromCsvCommand = buildCommand({\n loader: async () => {\n const { uploadDataFlowsFromCsv } = await import('./impl.js');\n return uploadDataFlowsFromCsv;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageDataFlow],\n }),\n trackerStatus: {\n kind: 'enum',\n values: Object.values(ConsentTrackerStatus),\n brief: 'The status of the data flows you will upload.',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file to upload',\n default: './data-flows.csv',\n },\n classifyService: {\n kind: 'boolean',\n brief:\n 'When true, automatically assign the service for a data flow based on the domain that is specified',\n default: false,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Upload data flows from CSV',\n fullDescription: `Upload data flows from CSV. This command allows for uploading of data flows from CSV.\n\nStep 1) Download the CSV of data flows that you want to edit from the Admin Dashboard under [Consent Management -> Data Flows](https://app.transcend.io/consent-manager/data-flows). You can download data flows from both the \"Triage\" and \"Approved\" tabs.\n\nStep 2) You can edit the contents of the CSV file as needed. You may adjust the \"Purpose\" column, adjust the \"Notes\" column, add \"Owners\" and \"Teams\" or even add custom columns with additional metadata.\n\nStep 3) Upload the modified CSV file back into the dashboard with this command.`,\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const uploadPreferencesCommand = buildCommand({\n loader: async () => {\n const { uploadPreferences } = await import('./impl.js');\n return uploadPreferences;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [\n ScopeName.ManageStoredPreferences,\n ScopeName.ViewManagedConsentDatabaseAdminApi,\n ScopeName.ViewPreferenceStoreSettings,\n ],\n }),\n partition: {\n kind: 'parsed',\n parse: String,\n brief: 'The partition key to download consent preferences to',\n },\n sombraAuth: createSombraAuthParameter(),\n transcendUrl: createTranscendUrlParameter(),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file to load preferences from',\n optional: true,\n },\n directory: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the directory of CSV files to load preferences from',\n optional: true,\n },\n dryRun: {\n kind: 'boolean',\n brief:\n 'Whether to do a dry run only - will write results to receiptFilepath without updating Transcend',\n default: false,\n },\n skipExistingRecordCheck: {\n kind: 'boolean',\n brief:\n 'Whether to skip the check for existing records. SHOULD ONLY BE USED FOR INITIAL UPLOAD',\n default: false,\n },\n receiptFileDir: {\n kind: 'parsed',\n parse: String,\n brief: 'Directory path where the response receipts should be saved',\n default: './receipts',\n },\n skipWorkflowTriggers: {\n kind: 'boolean',\n brief: 'Whether to skip workflow triggers when uploading to preference store',\n default: false,\n },\n forceTriggerWorkflows: {\n kind: 'boolean',\n brief: 'Whether to force trigger workflows for existing consent records',\n default: false,\n },\n skipConflictUpdates: {\n kind: 'boolean',\n brief:\n 'Whether to skip uploading of any records where the preference store and file have a hard conflict',\n default: false,\n },\n isSilent: {\n kind: 'boolean',\n brief: 'Whether to skip sending emails in workflows',\n default: true,\n },\n attributes: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Attributes to add to any DSR request if created. Comma-separated list of key:value pairs.',\n default: 'Tags:transcend-cli,Source:transcend-cli',\n },\n receiptFilepath: {\n kind: 'parsed',\n parse: String,\n brief: 'Store resulting, continuing where left off',\n default: './preference-management-upload-receipts.json',\n },\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading in parallel',\n default: '10',\n },\n },\n },\n docs: {\n brief: 'Upload preference management data to your Preference Store',\n fullDescription: `Upload preference management data to your Preference Store.\n\nThis command prompts you to map the shape of the CSV to the shape of the Transcend API. There is no requirement for the shape of the incoming CSV, as the script will handle the mapping process.\n\nThe script will also produce a JSON cache file that allows for the mappings to be preserved between runs.`,\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { buildXdiSyncEndpointCommand } from './build-xdi-sync-endpoint/command.js';\nimport { deletePreferenceRecordsCommand } from './delete-preference-records/command.js';\nimport { generateAccessTokensCommand } from './generate-access-tokens/command.js';\nimport { pullConsentMetricsCommand } from './pull-consent-metrics/command.js';\nimport { pullConsentPreferencesCommand } from './pull-consent-preferences/command.js';\nimport { updateConsentManagerCommand } from './update-consent-manager/command.js';\nimport { uploadConsentPreferencesCommand } from './upload-consent-preferences/command.js';\nimport { uploadCookiesFromCsvCommand } from './upload-cookies-from-csv/command.js';\nimport { uploadDataFlowsFromCsvCommand } from './upload-data-flows-from-csv/command.js';\nimport { uploadPreferencesCommand } from './upload-preferences/command.js';\n\nexport const consentRoutes = buildRouteMap({\n routes: {\n 'build-xdi-sync-endpoint': buildXdiSyncEndpointCommand,\n 'generate-access-tokens': generateAccessTokensCommand,\n 'pull-consent-metrics': pullConsentMetricsCommand,\n 'pull-consent-preferences': pullConsentPreferencesCommand,\n 'update-consent-manager': updateConsentManagerCommand,\n 'upload-consent-preferences': uploadConsentPreferencesCommand,\n 'upload-cookies-from-csv': uploadCookiesFromCsvCommand,\n 'upload-data-flows-from-csv': uploadDataFlowsFromCsvCommand,\n 'upload-preferences': uploadPreferencesCommand,\n 'delete-preference-records': deletePreferenceRecordsCommand,\n },\n docs: {\n brief: 'Consent commands',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const checkCommand = buildCommand({\n loader: async () => {\n const { check } = await import('./impl.js');\n return check;\n },\n parameters: {\n flags: {\n manifest: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to transcend-functions.yml; defaults inside the target directory',\n optional: true,\n },\n variables: {\n kind: 'parsed',\n parse: String,\n brief: 'Comma-separated variables to template into the manifest',\n default: '',\n },\n fix: {\n kind: 'boolean',\n brief: 'Apply Deno formatting to manifest-referenced files',\n default: false,\n },\n noInteractive: {\n kind: 'boolean',\n brief: 'Disable the optional formatting confirmation',\n default: false,\n },\n json: {\n kind: 'boolean',\n brief: 'Emit a stable JSON result and imply non-interactive behavior',\n default: false,\n },\n },\n positional: {\n kind: 'tuple',\n parameters: [\n {\n brief: 'Custom Function project directory',\n placeholder: 'directory',\n parse: String,\n optional: true,\n default: 'transcend/custom-functions',\n },\n ],\n },\n },\n docs: {\n brief: 'Validate a local Custom Function project without credentials',\n fullDescription:\n 'Checks manifest semantics and published payload schemas, then uses Deno 2 without executing user modules to inspect exports, type-check, lint, and verify formatting.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\n/** Flags accepted when initializing Custom Function authoring. */\nconst customFunctionInitFlagParameters = {\n manifest: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to transcend-functions.yml; defaults inside the target directory',\n optional: true,\n },\n deno: {\n kind: 'boolean',\n brief: 'Create or merge target-scoped Deno configuration and check task',\n optional: true,\n },\n editor: {\n kind: 'boolean',\n brief: 'Merge target-scoped Deno editor settings and recommendations',\n optional: true,\n },\n skill: {\n kind: 'boolean',\n brief: 'Install the canonical Custom Function coding-agent skill',\n optional: true,\n },\n ci: {\n kind: 'boolean',\n brief: 'Generate credential-free GitHub Actions checks',\n optional: true,\n },\n noInteractive: {\n kind: 'boolean',\n brief: 'Disable prompts and require every missing answer as a flag',\n default: false,\n },\n dryRun: {\n kind: 'boolean',\n brief: 'Preview all changes without writing files',\n default: false,\n },\n yes: {\n kind: 'boolean',\n brief: 'Skip only the final plan confirmation',\n default: false,\n },\n json: {\n kind: 'boolean',\n brief: 'Emit a stable JSON result and imply non-interactive output',\n default: false,\n },\n} as const;\n\nexport const initCommand = buildCommand({\n loader: async () => {\n const { init } = await import('./impl.js');\n return init;\n },\n parameters: {\n flags: customFunctionInitFlagParameters,\n positional: {\n kind: 'tuple',\n parameters: [\n {\n brief: 'Custom Function project directory',\n placeholder: 'directory',\n parse: String,\n optional: true,\n default: 'transcend/custom-functions',\n },\n ],\n },\n },\n docs: {\n brief: 'Initialize a local Custom Function project',\n fullDescription:\n 'Discovers the surrounding repository, previews one safe transactional plan, and creates only the selected local authoring setup. No Transcend credentials are needed.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const listCommand = buildCommand({\n loader: async () => {\n const { list } = await import('./impl.js');\n return list;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewDataMap],\n }),\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'List custom functions and their versions',\n fullDescription:\n 'List all custom functions in the organization along with their lifecycle state, active version, and any pending draft version.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nimport { CUSTOM_FUNCTION_TEMPLATE_NAMES } from '../../../lib/custom-functions/scaffold-templates.js';\n\n/** Flags accepted when adding a function to an initialized project. */\nconst customFunctionNewFlagParameters = {\n manifest: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to an existing transcend-functions.yml',\n optional: true,\n },\n name: {\n kind: 'parsed',\n parse: String,\n brief: 'Customer-visible Custom Function display name',\n optional: true,\n },\n template: {\n kind: 'enum',\n values: CUSTOM_FUNCTION_TEMPLATE_NAMES,\n brief: 'Function type and generated handler shape',\n optional: true,\n },\n noInteractive: {\n kind: 'boolean',\n brief: 'Disable prompts and require every missing answer as a flag',\n default: false,\n },\n dryRun: {\n kind: 'boolean',\n brief: 'Preview all changes without writing files',\n default: false,\n },\n yes: {\n kind: 'boolean',\n brief: 'Skip only the final plan confirmation',\n default: false,\n },\n json: {\n kind: 'boolean',\n brief: 'Emit a stable JSON result and imply non-interactive output',\n default: false,\n },\n} as const;\n\nexport const newCommand = buildCommand({\n loader: async () => {\n const { _new } = await import('./impl.js');\n return _new;\n },\n parameters: {\n flags: customFunctionNewFlagParameters,\n positional: {\n kind: 'tuple',\n parameters: [\n {\n brief: 'Custom Function project directory',\n placeholder: 'directory',\n parse: String,\n optional: true,\n default: 'transcend/custom-functions',\n },\n ],\n },\n },\n docs: {\n brief: 'Scaffold one local Custom Function and its test fixtures',\n fullDescription:\n 'Adds a deterministic starter for one of two Custom Function types: General functions triggered by Rules Automation, or DSR functions triggered by a Workflow step and supporting data point resolvers, preflight checks, or both.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../lib/cli/parsers.js';\n\nexport const pushCommand = buildCommand({\n loader: async () => {\n const { push } = await import('./impl.js');\n return push;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageDataMap],\n }),\n sombraAuth: createSombraAuthParameter(),\n transcendUrl: createTranscendUrlParameter(),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the custom functions manifest YAML file',\n default: './transcend-functions.yml',\n },\n variables: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Variables to template into the manifest file (e.g. secret env values). Comma-separated list of key:value pairs.',\n default: '',\n },\n dryRun: {\n kind: 'boolean',\n brief: 'When true, report what would change without pushing anything',\n default: false,\n },\n promote: {\n kind: 'boolean',\n brief:\n 'When true, promote new revisions to active. Set to false to leave new revisions as drafts for review in the dashboard.',\n default: true,\n },\n force: {\n kind: 'boolean',\n brief:\n 'Push a new revision even when no changes are detected. Useful when only environment variable values changed, which cannot be diffed.',\n default: false,\n },\n skipTests: {\n kind: 'boolean',\n brief:\n 'Skip test runs entirely, pushing functions without executing their test-payload files. Tests also do not run on --dryRun (nothing is signed on dry runs).',\n default: false,\n },\n updateManifest: {\n kind: 'boolean',\n brief:\n 'After pushing, write the assigned custom function IDs back into the manifest file so future pushes match by ID instead of by name. Comments and <<parameters.x>> placeholders are preserved.',\n default: false,\n },\n sombraId: {\n kind: 'parsed',\n parse: uuidParser,\n brief:\n 'Default Sombra gateway for functions whose manifest entry (or existing function) does not pin one. Each function is signed against the gateway it belongs to. Defaults to the primary Sombra of the organization.',\n optional: true,\n },\n },\n },\n docs: {\n brief: 'Create or update custom function code revisions from a manifest',\n fullDescription: `Sync custom function source code from your repository to Transcend.\n\nGiven a manifest file mapping custom function names to TypeScript source files (plus execution context like allowed hosts, timeout, and environment variables), this command:\n\n1. Signs each function's code and context against your Sombra gateway's customer ingress (pass --sombraAuth when self-hosting Sombra)\n2. Creates the DSR integration (data silo) for any new DSR function that does not specify a data-silo-id\n3. Test-runs the freshly signed code with each of the entry's test payloads, when defined (unless --skipTests) — DSR functions can cover both their default (DATA_POINT) and enricher (REQUEST_ENRICHER) exports. Any failing payload rolls back any integration created in step 2\n4. Creates any custom functions that do not exist yet (linking new DSR functions to their integration)\n5. Pushes a new code revision for any function whose code or context changed\n6. Promotes new revisions to active (unless --promote=false)\n\nMetadata-only changes (description, or name for entries pinned by id) are updated in place without signing, testing, or pushing a new code revision. Environment variable values are encrypted at sign time and cannot be diffed — pass --force to re-push when only env values changed.\n\nFunctions with any failing test run are rejected — every failing payload's reason and execution logs are printed, nothing is pushed for that function, and the command exits 1. Functions without test payloads push as before, with a warning. Test runs require backend support for pre-signed code JWTs on the runCustomFunction mutation.\n\nFunctions whose code and context are unchanged are skipped, so this command is safe to run on every CI push.\n\nFunction code is invoked with a single argument of shape { payload, environment } — payload is the invocation JSON (free-form for GENERAL functions, the webhook notification shape for DSR functions) and environment is the manifest entry's env block. DSR functions may also export an enricher entry point.`,\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const runCommand = buildCommand({\n loader: async () => {\n const { run } = await import('./impl.js');\n return run;\n },\n parameters: {\n flags: {\n manifest: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to transcend-functions.yml; defaults inside the target directory',\n optional: true,\n },\n function: {\n kind: 'parsed',\n parse: String,\n brief: 'Exact Custom Function name or ID; prompts when omitted',\n optional: true,\n },\n variables: {\n kind: 'parsed',\n parse: String,\n brief: 'Comma-separated manifest variables such as API_KEY:value',\n default: '',\n },\n noInteractive: {\n kind: 'boolean',\n brief: 'Disable function selection prompts',\n default: false,\n },\n allowNetwork: {\n kind: 'boolean',\n brief: 'Permit real native fetch calls to manifest allowed-hosts',\n default: false,\n },\n },\n positional: {\n kind: 'tuple',\n parameters: [\n {\n brief: 'Custom Function project directory',\n placeholder: 'directory',\n parse: String,\n optional: true,\n default: 'transcend/custom-functions',\n },\n ],\n },\n },\n docs: {\n brief: 'Run Custom Function fixtures in a local Deno simulator',\n fullDescription:\n 'Executes one self-contained manifest function against its configured test payloads with production-like payload preparation, restricted Deno permissions, an in-memory KV store, and a simulated sdk.fetch implementation. No credentials are required. Native fetch is disabled unless --allowNetwork is passed; module imports follow allow-third-party-imports.',\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { checkCommand } from './check/command.js';\nimport { initCommand } from './init/command.js';\nimport { listCommand } from './list/command.js';\nimport { newCommand } from './new/command.js';\nimport { pushCommand } from './push/command.js';\nimport { runCommand } from './run/command.js';\n\nexport const customFunctionsRoutes = buildRouteMap({\n routes: {\n init: initCommand,\n new: newCommand,\n check: checkCommand,\n run: runCommand,\n push: pushCommand,\n list: listCommand,\n },\n docs: {\n brief: 'Manage custom function code from your own repository',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nimport { buildExampleCommand } from '../../../lib/docgen/buildExamples.js';\nimport { PushCommandFlags } from '../push/impl.js';\nimport { ConsentManagerServiceJsonToYmlCommandFlags } from './impl.js';\n\nexport const consentManagerServiceJsonToYmlCommand = buildCommand({\n loader: async () => {\n const { consentManagerServiceJsonToYml } = await import('./impl.js');\n return consentManagerServiceJsonToYml;\n },\n parameters: {\n flags: {\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the services.json file, output of await airgap.getMetadata()',\n default: './services.json',\n },\n output: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the output transcend.yml to write to',\n default: './transcend.yml',\n },\n },\n },\n docs: {\n brief: 'Convert consent manager services to transcend.yml',\n fullDescription: `Import the services from an airgap.js file into a Transcend instance.\n\n1. Run \\`await airgap.getMetadata()\\` on a site with airgap\n2. Right click on the printed object, and click \\`Copy object\\`\n3. Place output of file in a file named \\`services.json\\`\n4. Run:\n\n ${buildExampleCommand<ConsentManagerServiceJsonToYmlCommandFlags>(\n ['inventory', 'consent-manager-service-json-to-yml'],\n {\n file: './services.json',\n output: './transcend.yml',\n },\n { argsIndent: 5 },\n )}\n\n5. Run:\n\n ${buildExampleCommand<PushCommandFlags>(\n ['inventory', 'push'],\n {\n auth: '$TRANSCEND_API_KEY',\n file: './transcend.yml',\n classifyService: true,\n },\n { argsIndent: 5 },\n )}`,\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const consentManagersToBusinessEntitiesCommand = buildCommand({\n loader: async () => {\n const { consentManagersToBusinessEntities } = await import('./impl.js');\n return consentManagersToBusinessEntities;\n },\n parameters: {\n flags: {\n consentManagerYmlFolder: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the folder of Consent Manager transcend.yml files to combine',\n },\n output: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the output transcend.yml with business entity configuration',\n default: './combined-business-entities.yml',\n },\n },\n },\n docs: {\n brief: 'Convert consent managers to business entities',\n fullDescription:\n 'This command allows for converting a folder or Consent Manager transcend.yml files into a single transcend.yml file where each consent manager configuration is a Business Entity in the data inventory.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const deriveDataSilosFromDataFlowsCrossInstanceCommand = buildCommand({\n loader: async () => {\n const { deriveDataSilosFromDataFlowsCrossInstance } = await import('./impl.js');\n return deriveDataSilosFromDataFlowsCrossInstance;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [],\n }),\n dataFlowsYmlFolder: {\n kind: 'parsed',\n parse: String,\n brief: 'The folder that contains data flow yml files',\n },\n output: {\n kind: 'parsed',\n parse: String,\n brief: 'The output transcend.yml file containing the data silo configurations',\n default: './transcend.yml',\n },\n ignoreYmls: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'The set of yml files that should be skipped when uploading',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Derive data silos from data flows cross instance',\n fullDescription:\n 'Given a folder of data flow transcend.yml configurations, convert those configurations to a single transcend.yml configurations of all related data silos.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const deriveDataSilosFromDataFlowsCommand = buildCommand({\n loader: async () => {\n const { deriveDataSilosFromDataFlows } = await import('./impl.js');\n return deriveDataSilosFromDataFlows;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [],\n }),\n dataFlowsYmlFolder: {\n kind: 'parsed',\n parse: String,\n brief: 'The folder that contains data flow yml files',\n },\n dataSilosYmlFolder: {\n kind: 'parsed',\n parse: String,\n brief: 'The folder that contains data silo yml files',\n },\n ignoreYmls: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'The set of yml files that should be skipped when uploading',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Derive data silos from data flows',\n fullDescription:\n 'Given a folder of data flow transcend.yml configurations, convert those configurations to set of data silo transcend.yml configurations.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../lib/cli/parsers.js';\n\nexport const discoverSilosCommand = buildCommand({\n loader: async () => {\n const { discoverSilos } = await import('./impl.js');\n return discoverSilos;\n },\n parameters: {\n flags: {\n scanPath: {\n kind: 'parsed',\n parse: String,\n brief: 'File path in the project to scan',\n },\n dataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The UUID of the corresponding data silo',\n },\n auth: createAuthParameter({\n scopes: [ScopeName.ManageAssignedDataInventory],\n requiresSiloScope: true,\n }),\n fileGlobs: {\n kind: 'parsed',\n parse: String,\n brief:\n 'You can pass a glob syntax pattern(s) to specify additional file paths to scan. Comma-separated list of globs.',\n default: '',\n },\n ignoreDirs: {\n kind: 'parsed',\n parse: String,\n brief: 'Comma-separated list of directories to ignore.',\n default: '',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Scan dependency management files to discover new data silos.',\n fullDescription: `We support scanning for new data silos in JavaScript, Python, Gradle, and CocoaPods projects.\n\nTo get started, add a data silo for the corresponding project type with the \"silo discovery\" plugin enabled. For example, if you want to scan a JavaScript project, add a package.json data silo. Then, specify the data silo ID in the \"--dataSiloId\" parameter.`,\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { DataCategoryType, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const pullDatapointsCommand = buildCommand({\n loader: async () => {\n const { pullDatapoints } = await import('./impl.js');\n return pullDatapoints;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewDataInventory],\n }),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'The file to save datapoints to',\n default: './datapoints.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n dataSiloIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'List of data silo IDs to filter by',\n optional: true,\n },\n includeAttributes: {\n kind: 'boolean',\n brief: 'Whether to include attributes in the output',\n default: false,\n },\n includeGuessedCategories: {\n kind: 'boolean',\n brief: 'Whether to include guessed categories in the output',\n default: false,\n },\n parentCategories: {\n kind: 'enum',\n values: Object.values(DataCategoryType),\n brief: 'List of parent categories to filter by',\n variadic: ',',\n optional: true,\n },\n subCategories: {\n kind: 'parsed',\n parse: String,\n brief: 'List of subcategories to filter by',\n variadic: ',',\n optional: true,\n },\n },\n },\n docs: {\n brief: 'Export the datapoints from your Data Inventory into a CSV.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport {\n ScopeName,\n UnstructuredSubDataPointRecommendationStatus,\n} from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const pullUnstructuredDiscoveryFilesCommand = buildCommand({\n loader: async () => {\n const { pullUnstructuredDiscoveryFiles } = await import('./impl.js');\n return pullUnstructuredDiscoveryFiles;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewDataInventory],\n }),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'The file to save datapoints to',\n default: './unstructured-discovery-files.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n dataSiloIds: {\n kind: 'parsed',\n parse: String,\n brief: 'List of data silo IDs to filter by',\n variadic: ',',\n optional: true,\n },\n subCategories: {\n kind: 'parsed',\n parse: String,\n brief: 'List of data categories to filter by',\n variadic: ',',\n optional: true,\n },\n status: {\n kind: 'enum',\n values: Object.values(UnstructuredSubDataPointRecommendationStatus),\n brief: 'List of classification statuses to filter by',\n variadic: ',',\n optional: true,\n },\n includeEncryptedSnippets: {\n kind: 'boolean',\n brief: 'Whether to include encrypted snippets of the entries classified',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Pull unstructured discovery files',\n fullDescription: 'This command allows for pulling Unstructured Discovery into a CSV.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const pushCommand = buildCommand({\n loader: async () => {\n const { push } = await import('./impl.js');\n return push;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: 'Varies',\n }),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the YAML file to push from',\n default: './transcend.yml',\n },\n transcendUrl: createTranscendUrlParameter(),\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 variables: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Variables to template into the YAML file when pushing configuration. Comma-separated list of key:value pairs.',\n default: '',\n },\n publishToPrivacyCenter: {\n kind: 'boolean',\n brief: 'When true, publish the configuration to the Privacy Center',\n default: false,\n },\n classifyService: {\n kind: 'boolean',\n brief:\n 'When true, automatically assign the service for a data flow based on the domain that is specified',\n default: false,\n },\n deleteExtraAttributeValues: {\n kind: 'boolean',\n brief:\n 'When true and syncing attributes, delete any extra attributes instead of just upserting',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Push metadata from transcend.yml to Transcend',\n fullDescription: 'Given a transcend.yml file, sync the contents up to your Transcend instance.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const scanPackagesCommand = buildCommand({\n loader: async () => {\n const { scanPackages } = await import('./impl.js');\n return scanPackages;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageCodeScanning],\n }),\n scanPath: {\n kind: 'parsed',\n parse: String,\n brief: 'File path in the project to scan',\n default: './',\n },\n ignoreDirs: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'List of directories to ignore in scan',\n optional: true,\n },\n repositoryName: {\n kind: 'parsed',\n parse: String,\n brief: 'Name of the git repository that the package should be tied to',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Scan dependency management files to inventory code dependencies.',\n fullDescription: `Transcend scans packages and dependencies for the following frameworks:\n\n- package.json\n- requirements.txt & setup.py\n- Podfile\n- Package.resolved\n- build.gradle\n- pubspec.yaml\n- Gemfile & .gemspec\n- composer.json\n\nThis command will scan the folder you point at to look for any of these files. Once found, the build file will be parsed in search of dependencies. Those code packages and dependencies will be uploaded to Transcend. The information uploaded to Transcend is:\n\n- repository name\n- package names\n- dependency names and versions\n- package descriptions`,\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { consentManagerServiceJsonToYmlCommand } from './consent-manager-service-json-to-yml/command.js';\nimport { consentManagersToBusinessEntitiesCommand } from './consent-managers-to-business-entities/command.js';\nimport { deriveDataSilosFromDataFlowsCrossInstanceCommand } from './derive-data-silos-from-data-flows-cross-instance/command.js';\nimport { deriveDataSilosFromDataFlowsCommand } from './derive-data-silos-from-data-flows/command.js';\nimport { discoverSilosCommand } from './discover-silos/command.js';\nimport { pullDatapointsCommand } from './pull-datapoints/command.js';\nimport { pullUnstructuredDiscoveryFilesCommand } from './pull-unstructured-discovery-files/command.js';\nimport { pullCommand } from './pull/command.js';\nimport { pushCommand } from './push/command.js';\nimport { scanPackagesCommand } from './scan-packages/command.js';\n\nexport const inventoryRoutes = buildRouteMap({\n routes: {\n pull: pullCommand,\n push: pushCommand,\n 'scan-packages': scanPackagesCommand,\n 'discover-silos': discoverSilosCommand,\n 'pull-datapoints': pullDatapointsCommand,\n 'pull-unstructured-discovery-files': pullUnstructuredDiscoveryFilesCommand,\n 'derive-data-silos-from-data-flows': deriveDataSilosFromDataFlowsCommand,\n 'derive-data-silos-from-data-flows-cross-instance':\n deriveDataSilosFromDataFlowsCrossInstanceCommand,\n 'consent-manager-service-json-to-yml': consentManagerServiceJsonToYmlCommand,\n 'consent-managers-to-business-entities': consentManagersToBusinessEntitiesCommand,\n },\n docs: {\n brief: 'Inventory commands',\n },\n});\n","import { buildCommand, type TypedFlagParameter } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../context.js';\nimport { OneTrustPullResource, OneTrustPullSource } from '../../../enums.js';\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const syncOtCommand = buildCommand({\n loader: async () => {\n const { syncOt } = await import('./impl.js');\n return syncOt;\n },\n parameters: {\n flags: {\n hostname: {\n kind: 'parsed',\n parse: String,\n brief: 'The domain of the OneTrust environment from which to pull the resource',\n optional: true,\n },\n oneTrustAuth: {\n kind: 'parsed',\n parse: String,\n brief:\n 'The OAuth access token with the scopes necessary to access the OneTrust Public APIs',\n optional: true,\n },\n source: {\n kind: 'enum',\n values: Object.values(OneTrustPullSource) as OneTrustPullSource[],\n brief: 'Whether to read the assessments from OneTrust or from a file',\n default: OneTrustPullSource.OneTrust,\n },\n transcendAuth: {\n ...createAuthParameter({\n scopes: [ScopeName.ManageAssessments],\n }),\n optional: true,\n } as TypedFlagParameter<string | undefined, LocalContext>,\n transcendUrl: createTranscendUrlParameter(),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the file to pull the resource into. Must be a json file!',\n optional: true,\n },\n resource: {\n kind: 'enum',\n values: Object.values(OneTrustPullResource) as OneTrustPullResource[],\n brief: 'The resource to pull from OneTrust. For now, only assessments is supported',\n default: OneTrustPullResource.Assessments,\n },\n dryRun: {\n kind: 'boolean',\n brief: 'Whether to export the resource to a file rather than sync to Transcend',\n default: false,\n },\n debug: {\n kind: 'boolean',\n brief: 'Whether to print detailed logs in case of error',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Sync OneTrust data',\n fullDescription: `Pulls resources from a OneTrust and syncs them to a Transcend instance. For now, it only supports retrieving OneTrust Assessments.\n\nThis command can be helpful if you are looking to:\n- Pull resources from your OneTrust account.\n- Migrate your resources from your OneTrust account to Transcend.\n\nOneTrust authentication requires an OAuth Token with scope for accessing the assessment endpoints.\nIf syncing the resources to Transcend, you will also need to generate an API key on the Transcend Admin Dashboard.`,\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { syncOtCommand } from './sync-ot/command.js';\n\nexport const migrationRoutes = buildRouteMap({\n routes: {\n 'sync-ot': syncOtCommand,\n },\n docs: {\n brief: 'Migration commands',\n },\n});\n","/**\n * Shared `--debug` flag for Policy Engine API commands.\n *\n * @returns Stricli flag definition\n */\nexport function createPolicyDebugParameter() {\n return {\n kind: 'boolean' as const,\n brief:\n 'Include technical error details (underlying API message and stack trace) when a command fails',\n optional: true as const,\n };\n}\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { createPolicyDebugParameter } from '../helpers/policyCommandParameters.js';\n\nexport const activateCommand = buildCommand({\n loader: async () => {\n const { activate } = await import('./impl.js');\n return activate;\n },\n parameters: {\n flags: {\n 'bundle-name': {\n kind: 'parsed',\n parse: String,\n brief:\n 'Logical policy bundle name (the same string used in publish/bundles); resolved to the parent bundle UUID internally',\n },\n version: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Caller-supplied version label to activate; defaults to the latest uploaded version by createdAt',\n optional: true,\n },\n auth: createAuthParameter({\n scopes: [ScopeName.ActivatePolicyEngineBundles],\n }),\n 'transcend-url': createTranscendUrlParameter(),\n 'dry-run': {\n kind: 'boolean',\n brief: 'Validate activation without flipping the active version',\n default: false,\n },\n json: {\n kind: 'boolean',\n brief: 'Print the raw JSON API response',\n default: false,\n },\n debug: createPolicyDebugParameter(),\n },\n },\n docs: {\n brief: 'Activate an uploaded policy bundle version',\n fullDescription:\n 'Calls the Policy Engine activate endpoint to make an uploaded version live. ' +\n 'Addressed by bundle name (resolved to the parent bundle UUID internally). ' +\n 'When --version is omitted, activates the latest uploaded version by createdAt. ' +\n 'Requires a Transcend API key with Activate Policy scope.',\n },\n});\n","/** Maximum page size accepted by the Policy Engine list endpoints. */\nexport const MAX_POLICY_LIMIT = 100;\n\n/**\n * Parses a `--limit` value for Policy Engine list commands.\n *\n * Requires a positive integer and enforces the server-side cap of\n * {@link MAX_POLICY_LIMIT} client-side so that an over-large page size is\n * rejected with a clear message instead of an opaque server `400`.\n *\n * @param value - Raw CLI input\n * @returns Validated limit\n */\nexport function parseLimitParam(value: string): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`--limit must be a positive integer (received \"${value}\")`);\n }\n if (parsed > MAX_POLICY_LIMIT) {\n throw new Error(`--limit must be at most ${MAX_POLICY_LIMIT} (received \"${value}\")`);\n }\n return parsed;\n}\n\n/**\n * Parses an `--offset` value for offset-paginated Policy Engine commands.\n *\n * Requires a non-negative integer. Fractional values (e.g. `2.5`) are rejected\n * client-side rather than forwarded to the server as an opaque `400`.\n *\n * @param value - Raw CLI input\n * @returns Validated offset\n */\nexport function parseOffsetParam(value: string): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`--offset must be a non-negative integer (received \"${value}\")`);\n }\n return parsed;\n}\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { parseLimitParam, parseOffsetParam } from '../helpers/index.js';\nimport { createPolicyDebugParameter } from '../helpers/policyCommandParameters.js';\n\nexport const bundlesCommand = buildCommand({\n loader: async () => {\n const { bundles } = await import('./impl.js');\n return bundles;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewPolicyEngineBundles],\n }),\n 'transcend-url': createTranscendUrlParameter(),\n limit: {\n kind: 'parsed',\n parse: parseLimitParam,\n brief: 'Maximum number of bundles to return (1-100)',\n default: '50',\n },\n offset: {\n kind: 'parsed',\n parse: parseOffsetParam,\n brief: 'Number of records to skip before returning results',\n default: '0',\n },\n json: {\n kind: 'boolean',\n brief: 'Print the raw JSON API response',\n default: false,\n },\n debug: createPolicyDebugParameter(),\n },\n },\n docs: {\n brief: 'List policy bundles for the current organization',\n fullDescription:\n 'Lists policy bundles registered for the authenticated organization. ' +\n 'Requires a Transcend API key with View Policy scope.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { createPolicyDebugParameter } from '../helpers/policyCommandParameters.js';\n\nexport const deactivateCommand = buildCommand({\n loader: async () => {\n const { deactivate } = await import('./impl.js');\n return deactivate;\n },\n parameters: {\n flags: {\n 'bundle-name': {\n kind: 'parsed',\n parse: String,\n brief:\n 'Logical policy bundle name (the same string used in publish/bundles); resolved to the parent bundle UUID internally',\n },\n auth: createAuthParameter({\n scopes: [ScopeName.ActivatePolicyEngineBundles],\n }),\n 'transcend-url': createTranscendUrlParameter(),\n json: {\n kind: 'boolean',\n brief: 'Print the raw JSON API response',\n default: false,\n },\n debug: createPolicyDebugParameter(),\n },\n },\n docs: {\n brief: 'Deactivate the active version of a policy bundle',\n fullDescription:\n 'Calls the Policy Engine deactivate endpoint to take the currently active ' +\n 'version of a bundle offline, clearing its active version pointer. ' +\n 'Addressed by bundle name (resolved to the parent bundle UUID internally). ' +\n 'Requires a Transcend API key with Activate Policy scope.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { createPolicyDebugParameter } from '../helpers/policyCommandParameters.js';\n\nexport const downloadCommand = buildCommand({\n loader: async () => {\n const { download } = await import('./impl.js');\n return download;\n },\n parameters: {\n flags: {\n 'bundle-name': {\n kind: 'parsed',\n parse: String,\n brief: 'Tenant-unique policy bundle name',\n },\n version: {\n kind: 'parsed',\n parse: String,\n brief:\n \"Caller-supplied version label to download; defaults to the bundle's currently active version\",\n optional: true,\n },\n output: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Destination file path for the compiled .tar.gz bundle (defaults to {bundleName}-{version}.tar.gz)',\n optional: true,\n },\n auth: createAuthParameter({\n scopes: [ScopeName.ViewPolicyEngineBundles],\n }),\n 'transcend-url': createTranscendUrlParameter(),\n json: {\n kind: 'boolean',\n brief:\n 'Print version metadata and the presigned download URL as JSON without writing a file',\n default: false,\n },\n debug: createPolicyDebugParameter(),\n },\n },\n docs: {\n brief: 'Download a compiled policy bundle version',\n fullDescription:\n 'Resolves a bundle name and optional version label, fetches a short-lived presigned URL from the ' +\n 'Policy Engine API, and downloads the compiled OPA bundle tarball (.tar.gz) to disk. ' +\n 'When --version is omitted, downloads the currently active version (errors if none is active). ' +\n 'With --json, prints metadata and the presigned URL without writing a file. ' +\n 'Requires a Transcend API key with View Policy scope.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const evalCommand = buildCommand({\n loader: async () => {\n const { _eval } = await import('./impl.js');\n return _eval;\n },\n parameters: {\n flags: {\n pkg: {\n kind: 'parsed',\n parse: String,\n brief: 'OPA package or query to evaluate (e.g. data.transcend.decision)',\n },\n input: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to a JSON envelope input file',\n },\n bundle: {\n kind: 'parsed',\n parse: String,\n brief: 'Optional local policy bundle directory',\n optional: true,\n },\n },\n },\n docs: {\n brief: 'Evaluate one envelope against a local policy bundle',\n fullDescription:\n 'Wraps `opa eval` for local policy debugging. Requires the `opa` CLI on PATH. ' +\n 'No Transcend API key is needed.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const initCommand = buildCommand({\n loader: async () => {\n const { init } = await import('./impl.js');\n return init;\n },\n parameters: {\n flags: {\n editor: {\n kind: 'boolean',\n brief: 'Merge strict target-scoped VS Code settings, extensions, and lint task',\n optional: true,\n },\n skill: {\n kind: 'boolean',\n brief: 'Install the canonical Policy Engine coding-agent skill',\n optional: true,\n },\n ci: {\n kind: 'boolean',\n brief: 'Generate credential-free validation-only GitHub Actions',\n optional: true,\n },\n noInteractive: {\n kind: 'boolean',\n brief: 'Disable prompts and enable optional setup only through explicit flags',\n default: false,\n },\n dryRun: {\n kind: 'boolean',\n brief: 'Preview all changes without writing files',\n default: false,\n },\n yes: {\n kind: 'boolean',\n brief: 'Skip only the final plan confirmation',\n default: false,\n },\n json: {\n kind: 'boolean',\n brief: 'Emit one stable JSON result and imply non-interactive output',\n default: false,\n },\n },\n positional: {\n kind: 'tuple',\n parameters: [\n {\n brief: 'Policy project directory',\n placeholder: 'directory',\n parse: String,\n optional: true,\n default: 'transcend/policy',\n },\n ],\n },\n },\n docs: {\n brief: 'Initialize a safe local policy project',\n fullDescription:\n 'Probes OPA and Regal, previews one safe transactional plan, and creates a publishable fail-closed Rego v1 starter only in an empty target. Optional editor, Agent Skill, and validation-only CI setup preserve repository customization. No Transcend credentials are needed.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const lintCommand = buildCommand({\n loader: async () => {\n const { lint } = await import('./impl.js');\n return lint;\n },\n parameters: {\n flags: {\n dir: {\n kind: 'parsed',\n parse: String,\n brief: 'Directory containing the local policy project',\n default: 'transcend/policy',\n },\n fix: {\n kind: 'boolean',\n brief: 'Apply OPA formatting without running broad Regal fixes',\n default: false,\n },\n noInteractive: {\n kind: 'boolean',\n brief: 'Disable the optional formatting confirmation',\n default: false,\n },\n json: {\n kind: 'boolean',\n brief: 'Emit one stable JSON result and imply non-interactive behavior',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Verify a local policy project with OPA and Regal',\n fullDescription:\n 'Validates manifest roots and package coverage, verifies OPA 1.x and Regal, checks or repairs OPA formatting, ' +\n 'runs a production-only strict OPA check, treats Regal warnings as failures, and requires non-empty OPA tests. ' +\n 'No Transcend API key is needed.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { createPolicyDebugParameter } from '../helpers/policyCommandParameters.js';\n\nexport const publishCommand = buildCommand({\n loader: async () => {\n const { publish } = await import('./impl.js');\n return publish;\n },\n parameters: {\n flags: {\n dir: {\n kind: 'parsed',\n parse: String,\n brief: 'Directory containing manifest.json and Rego policy files',\n },\n 'bundle-name': {\n kind: 'parsed',\n parse: String,\n brief: 'Tenant-unique policy bundle name',\n },\n auth: createAuthParameter({\n scopes: [ScopeName.ManagePolicyEngineBundles],\n }),\n 'transcend-url': createTranscendUrlParameter(),\n version: {\n kind: 'parsed',\n parse: String,\n brief: 'Version label (defaults to {bundleName}-yyyy-mm-dd-hh-mm-ss)',\n optional: true,\n },\n description: {\n kind: 'parsed',\n parse: String,\n brief: 'Optional description for the uploaded version',\n optional: true,\n },\n json: {\n kind: 'boolean',\n brief: 'Print the raw JSON API response',\n default: false,\n },\n yes: {\n kind: 'boolean',\n brief: 'Skip the \"create new bundle\" confirmation (for CI/non-interactive use)',\n default: false,\n },\n debug: createPolicyDebugParameter(),\n },\n },\n docs: {\n brief: 'Build and upload a new policy bundle version',\n fullDescription:\n 'Packages manifest.json and .rego policy files from a local directory into a tarball and uploads it to Transcend. ' +\n 'Creates the bundle on first upload, then appends immutable versions. ' +\n 'Requires the `opa` CLI on PATH (for `opa check` and `opa build` validation) and a Transcend API key with Manage Policy scope.',\n },\n});\n","import { buildCommand } from '@stricli/core';\n\nexport const testCommand = buildCommand({\n loader: async () => {\n const { test } = await import('./impl.js');\n return test;\n },\n parameters: {\n flags: {\n dir: {\n kind: 'parsed',\n parse: String,\n brief: 'Directory containing Rego policy files and tests',\n },\n },\n },\n docs: {\n brief: 'Run OPA tests against a local policy bundle',\n fullDescription:\n 'Wraps `opa test` for a local policy directory. Requires the `opa` CLI on PATH. ' +\n 'No Transcend API key is needed.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { parseLimitParam } from '../helpers/index.js';\nimport { createPolicyDebugParameter } from '../helpers/policyCommandParameters.js';\n\nexport const versionsCommand = buildCommand({\n loader: async () => {\n const { versions } = await import('./impl.js');\n return versions;\n },\n parameters: {\n flags: {\n 'bundle-name': {\n kind: 'parsed',\n parse: String,\n brief: 'Tenant-unique policy bundle name',\n },\n auth: createAuthParameter({\n scopes: [ScopeName.ViewPolicyEngineBundles],\n }),\n 'transcend-url': createTranscendUrlParameter(),\n limit: {\n kind: 'parsed',\n parse: parseLimitParam,\n brief: 'Maximum number of versions to return (1-100)',\n default: '50',\n },\n after: {\n kind: 'parsed',\n parse: String,\n brief: 'Opaque cursor from a previous response pageInfo.endCursor',\n optional: true,\n },\n json: {\n kind: 'boolean',\n brief: 'Print the raw JSON API response',\n default: false,\n },\n debug: createPolicyDebugParameter(),\n },\n },\n docs: {\n brief: 'List versions for a policy bundle',\n fullDescription:\n 'Resolves a bundle name to its UUID and lists uploaded versions. ' +\n 'Requires a Transcend API key with View Policy scope.',\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { activateCommand } from './activate/command.js';\nimport { bundlesCommand } from './bundles/command.js';\nimport { deactivateCommand } from './deactivate/command.js';\nimport { downloadCommand } from './download/command.js';\nimport { evalCommand } from './eval/command.js';\nimport { initCommand } from './init/command.js';\nimport { lintCommand } from './lint/command.js';\nimport { publishCommand } from './publish/command.js';\nimport { testCommand } from './test/command.js';\nimport { versionsCommand } from './versions/command.js';\n\nexport const policyRoutes = buildRouteMap({\n routes: {\n activate: activateCommand,\n deactivate: deactivateCommand,\n download: downloadCommand,\n eval: evalCommand,\n init: initCommand,\n lint: lintCommand,\n bundles: bundlesCommand,\n publish: publishCommand,\n test: testCommand,\n versions: versionsCommand,\n },\n docs: {\n brief: 'Policy Engine commands',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction, RequestOrigin, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const approveCommand = buildCommand({\n loader: async () => {\n const { approve } = await import('./impl.js');\n return approve;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [\n ScopeName.RequestApproval,\n ScopeName.ViewRequests,\n ScopeName.ManageRequestCompilation,\n ],\n }),\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to approve',\n },\n origins: {\n kind: 'enum',\n values: Object.values(RequestOrigin),\n variadic: ',',\n brief: 'The request origins to approve',\n optional: true,\n },\n silentModeBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Any requests made before this date should be marked as silent mode',\n optional: true,\n },\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Approve requests that were submitted before this time',\n optional: true,\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Approve requests that were submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Approve requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Approve requests that were last updated after this time',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '50',\n },\n },\n },\n docs: {\n brief: 'Bulk approve a set of privacy requests',\n fullDescription:\n 'Bulk approve a set of privacy requests from the DSR Automation -> Incoming Requests tab.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction, RequestStatus, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const cancelCommand = buildCommand({\n loader: async () => {\n const { cancel } = await import('./impl.js');\n return cancel;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewRequests, ScopeName.RequestApproval],\n }),\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to cancel',\n },\n statuses: {\n kind: 'enum',\n values: Object.values(RequestStatus),\n variadic: ',',\n brief: 'The request statuses to cancel. Comma-separated list.',\n optional: true,\n },\n requestIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'Specify the specific request IDs to cancel',\n optional: true,\n },\n silentModeBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief:\n 'Any requests made before this date should be marked as silent mode for canceling to skip email sending',\n optional: true,\n },\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Cancel requests that were submitted before this time',\n optional: true,\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Cancel requests that were submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Cancel requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Cancel requests that were last updated after this time',\n optional: true,\n },\n cancellationTitle: {\n kind: 'parsed',\n parse: String,\n brief:\n 'The title of the email template that should be sent to the requests upon cancelation',\n default: 'Request Canceled',\n },\n transcendUrl: createTranscendUrlParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '50',\n },\n },\n },\n docs: {\n brief: 'Bulk cancel a set of privacy requests',\n fullDescription:\n 'Bulk cancel a set of privacy requests from the DSR Automation -> Incoming Requests tab.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { RequestAction } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../../lib/cli/parsers.js';\nimport { buildExampleCommand } from '../../../../lib/docgen/buildExamples.js';\nimport type { PullIdentifiersCommandFlags } from '../pull-identifiers/impl.js';\nimport type { MarkIdentifiersCompletedCommandFlags } from './impl.js';\n\nexport const markIdentifiersCompletedCommand = buildCommand({\n loader: async () => {\n const { markIdentifiersCompleted } = await import('./impl.js');\n return markIdentifiersCompleted;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [],\n requiresSiloScope: true,\n }),\n dataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the data silo to pull in',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file where identifiers will be written to',\n default: './cron-identifiers.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n sombraAuth: createSombraAuthParameter(),\n },\n },\n docs: {\n brief: 'Mark identifiers as completed after processing.',\n fullDescription: `This command takes the output of \"${buildExampleCommand<PullIdentifiersCommandFlags>(\n ['request', 'cron', 'pull-identifiers'],\n {},\n )}\" and notifies Transcend that all of the requests in the CSV have been processed.\nThis is used in the workflow like:\n\n1. Pull identifiers to CSV:\n\n ${buildExampleCommand<PullIdentifiersCommandFlags>(\n ['request', 'cron', 'pull-identifiers'],\n {\n auth: '$TRANSCEND_API_KEY',\n dataSiloId: '70810f2e-cf90-43f6-9776-901a5950599f',\n actions: [RequestAction.Erasure],\n file: './outstanding-requests.csv',\n },\n { argsIndent: 5 },\n )}\n\n2. Run your process to operate on that CSV of requests.\n\n3. Notify Transcend of completion\n\n ${buildExampleCommand<MarkIdentifiersCompletedCommandFlags>(\n ['request', 'cron', 'mark-identifiers-completed'],\n {\n auth: '$TRANSCEND_API_KEY',\n dataSiloId: '70810f2e-cf90-43f6-9776-901a5950599f',\n file: './outstanding-requests.csv',\n },\n { argsIndent: 5 },\n )}\n\nRead more at https://docs.transcend.io/docs/integrations/cron-job-integration.`,\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../../lib/cli/parsers.js';\n\nexport const pullIdentifiersCommand = buildCommand({\n loader: async () => {\n const { pullIdentifiers } = await import('./impl.js');\n return pullIdentifiers;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [],\n requiresSiloScope: true,\n }),\n dataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the data silo to pull in',\n },\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to restart',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file where identifiers will be written to',\n default: './cron-identifiers.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n sombraAuth: createSombraAuthParameter(),\n pageLimit: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The page limit to use when pulling in pages of identifiers',\n default: '100',\n },\n skipRequestCount: {\n kind: 'boolean',\n brief:\n 'Whether to skip the count of all outstanding requests. This is required to render the progress bar, but can take a long time to run if you have a large number of outstanding requests to process. In that case, we recommend setting skipRequestCount=true so that you can still proceed with fetching the identifiers',\n default: false,\n },\n chunkSize: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'Maximum number of rows per CSV file. For large datasets, the output will be automatically split into multiple files to avoid file system size limits. Each file will contain at most this many rows',\n default: '10000',\n },\n },\n },\n docs: {\n brief: 'Pull identifiers of outstanding requests for a data silo to a CSV.',\n fullDescription: `If you are using the cron job integration, you can run this command to pull the outstanding identifiers for the data silo to a CSV.\n\nFor large datasets, the output will be automatically split into multiple CSV files to avoid file system size limits. Use the --chunkSize parameter to control the maximum number of rows per file.\n\nRead more at https://docs.transcend.io/docs/integrations/cron-job-integration.`,\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../../lib/cli/parsers.js';\n\nexport const pullProfilesCommand = buildCommand({\n loader: async () => {\n const { pullProfiles } = await import('./impl.js');\n return pullProfiles;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [],\n requiresSiloScope: true,\n }),\n cronDataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the cron data silo to pull in',\n },\n targetDataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the target data silo to pull in',\n },\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to restart',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file where identifiers will be written to',\n default: './cron-identifiers.csv',\n },\n fileTarget: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file where identifiers will be written to',\n default: './cron-identifiers-target.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n sombraAuth: createSombraAuthParameter(),\n pageLimit: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The page limit to use when pulling in pages of identifiers',\n default: '100',\n },\n skipRequestCount: {\n kind: 'boolean',\n brief:\n 'Whether to skip the count of all outstanding requests. This is required to render the progress bar, but can take a long time to run if you have a large number of outstanding requests to process. In that case, we recommend setting skipRequestCount=true so that you can still proceed with fetching the identifiers',\n default: false,\n },\n chunkSize: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'Maximum number of rows per CSV file. For large datasets, the output will be automatically split into multiple files to avoid file system size limits. Each file will contain at most this many rows',\n default: '10000',\n },\n },\n },\n docs: {\n brief: 'Pull profiles of outstanding requests for a data silo to a CSV.',\n fullDescription: `If you are using the cron job integration, you can run this command to pull the outstanding profiles for the data silo to a CSV.\n\nFor large datasets, the output will be automatically split into multiple CSV files to avoid file system size limits. Use the --chunkSize parameter to control the maximum number of rows per file.\n\nRead more at https://docs.transcend.io/docs/integrations/cron-job-integration.`,\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { markIdentifiersCompletedCommand } from './mark-identifiers-completed/command.js';\nimport { pullIdentifiersCommand } from './pull-identifiers/command.js';\nimport { pullProfilesCommand } from './pull-profiles/command.js';\n\nexport const cronRoutes = buildRouteMap({\n routes: {\n 'pull-identifiers': pullIdentifiersCommand,\n 'pull-profiles': pullProfilesCommand,\n 'mark-identifiers-completed': markIdentifiersCompletedCommand,\n },\n docs: {\n brief: 'Cron commands',\n hideRoute: {\n 'pull-profiles': true,\n },\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestStatus, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const downloadFilesCommand = buildCommand({\n loader: async () => {\n const { downloadFiles } = await import('./impl.js');\n return downloadFiles;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [\n ScopeName.ViewRequestCompilation,\n ScopeName.ViewRequests,\n ScopeName.RequestApproval,\n ],\n }),\n sombraAuth: createSombraAuthParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when downloading requests in parallel',\n default: '10',\n },\n requestIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'Specify the specific request IDs to download',\n optional: true,\n },\n statuses: {\n kind: 'enum',\n values: Object.values(RequestStatus),\n variadic: ',',\n brief:\n 'The request statuses to download. Comma-separated list. Defaults to APPROVING,DOWNLOADABLE.',\n optional: true,\n },\n folderPath: {\n kind: 'parsed',\n parse: String,\n brief: 'The folder to download files to',\n default: './dsr-files',\n },\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Download requests that were submitted before this time',\n optional: true,\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Download requests that were submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Download requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Download requests that were last updated after this time',\n optional: true,\n },\n approveAfterDownload: {\n kind: 'boolean',\n brief: 'If the request is in status=APPROVING, approve the request after its downloaded',\n default: false,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Download the files associated with a Data Subject Access Request (DSAR)',\n fullDescription:\n 'Download the files associated with a Data Subject Access Request (DSAR) from DSR Automation -> Incoming Requests tab.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction, RequestEnricherStatus, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const enricherRestartCommand = buildCommand({\n loader: async () => {\n const { enricherRestart } = await import('./impl.js');\n return enricherRestart;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestCompilation],\n }),\n enricherId: {\n kind: 'parsed',\n parse: String,\n brief: 'The ID of the enricher to restart',\n },\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request action to restart',\n optional: true,\n },\n requestEnricherStatuses: {\n kind: 'enum',\n values: Object.values(RequestEnricherStatus),\n variadic: ',',\n brief: 'The request enricher statuses to restart',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '15',\n },\n requestIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'Specify the specific request IDs to restart',\n optional: true,\n },\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were submitted before this time',\n optional: true,\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were last updated after this time',\n optional: true,\n },\n },\n },\n docs: {\n brief: 'Bulk restart a particular enricher across a series of DSRs',\n fullDescription: `Bulk restart a particular enricher across a series of DSRs.\n\nThe API key needs the following scopes:\n- Manage Request Compilation`,\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction, RequestStatus, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const exportCommand = buildCommand({\n loader: async () => {\n const { _export } = await import('./impl.js');\n return _export;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewRequests, ScopeName.ViewRequestCompilation],\n }),\n sombraAuth: createSombraAuthParameter(),\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to export',\n optional: true,\n },\n statuses: {\n kind: 'enum',\n values: Object.values(RequestStatus),\n variadic: ',',\n brief: 'The request statuses to export',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file where identifiers will be written to',\n default: './transcend-request-export.csv',\n },\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'Number of parallel date-range chunks to split the query into. ' +\n 'Requires both --createdAtAfter and --createdAtBefore to be set.',\n default: '1',\n },\n skipRequestIdentifiers: {\n kind: 'boolean',\n brief: 'Skip exporting request identifiers',\n optional: true,\n },\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Pull requests that were submitted before this time',\n optional: true,\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Pull requests that were submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Pull requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Pull requests that were last updated after this time',\n optional: true,\n },\n showTests: {\n kind: 'boolean',\n brief: 'Filter for test requests or production requests - when not provided, pulls both',\n optional: true,\n },\n pageLimit: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The page limit to use when pulling in pages of requests',\n default: '100',\n },\n },\n },\n docs: {\n brief: 'Export privacy requests and request identifiers to a CSV file',\n fullDescription: 'Export privacy requests and request identifiers to a CSV file.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction, RequestStatus, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const markSilentCommand = buildCommand({\n loader: async () => {\n const { markSilent } = await import('./impl.js');\n return markSilent;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestCompilation],\n }),\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to mark silent',\n },\n statuses: {\n kind: 'enum',\n values: Object.values(RequestStatus),\n variadic: ',',\n brief:\n 'The request statuses to mark silent. Comma-separated list. Defaults to REQUEST_MADE,WAITING,ENRICHING,COMPILING,DELAYED,APPROVING,SECONDARY,SECONDARY_APPROVING.',\n optional: true,\n },\n requestIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'Specify the specific request IDs to mark silent',\n optional: true,\n },\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Mark silent requests that were submitted before this time',\n optional: true,\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Mark silent requests that were submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Mark silent requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Mark silent requests that were last updated after this time',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '50',\n },\n },\n },\n docs: {\n brief: 'Bulk update a set of privacy requests to be in silent mode',\n fullDescription:\n 'Bulk update a set of privacy requests from the DSR Automation -> Incoming Requests tab to be in silent mode.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const notifyAdditionalTimeCommand = buildCommand({\n loader: async () => {\n const { notifyAdditionalTime } = await import('./impl.js');\n return notifyAdditionalTime;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewRequests, ScopeName.RequestApproval],\n }),\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Notify requests that are open but submitted before this time',\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Notify requests that are open but submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Notify requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Notify requests that were last updated after this time',\n optional: true,\n },\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to notify',\n optional: true,\n },\n daysLeft: {\n kind: 'parsed',\n parse: numberParser,\n brief:\n 'Only notify requests that have less than this number of days until they are considered expired',\n default: '10',\n },\n days: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The number of days to adjust the expiration of the request to',\n default: '45',\n },\n requestIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'Specify the specific request IDs to notify',\n optional: true,\n },\n emailTemplate: {\n kind: 'parsed',\n parse: String,\n brief: 'The title of the email template that should be sent to the requests',\n default: 'Additional Time Needed',\n },\n transcendUrl: createTranscendUrlParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '50',\n },\n },\n },\n docs: {\n brief: 'Bulk notify a set of privacy requests that more time is needed',\n fullDescription:\n 'Bulk notify a set of privacy requests from the DSR Automation -> Incoming Requests tab that more time is needed to complete the request. Note any request in silent mode will not be emailed.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { RequestAction, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { buildExampleCommand } from '../../../../lib/docgen/buildExamples.js';\nimport type { PushIdentifiersCommandFlags } from '../push-identifiers/impl.js';\nimport type { PullIdentifiersCommandFlags } from './impl.js';\n\nexport const pullIdentifiersCommand = buildCommand({\n loader: async () => {\n const { pullIdentifiers } = await import('./impl.js');\n return pullIdentifiers;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ViewRequests, ScopeName.ViewRequestCompilation],\n }),\n sombraAuth: createSombraAuthParameter(),\n transcendUrl: createTranscendUrlParameter(),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file where requests will be written to',\n default: './manual-enrichment-identifiers.csv',\n },\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to pull for',\n optional: true,\n },\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '100',\n },\n },\n },\n docs: {\n brief: 'Pull identifiers for manual enrichment',\n fullDescription: `This command pulls down the set of privacy requests that are currently pending manual enrichment.\n\nThis is useful for the following workflow:\n\n1. Pull identifiers to CSV:\n\n ${buildExampleCommand<PullIdentifiersCommandFlags>(\n ['request', 'preflight', 'pull-identifiers'],\n {\n file: './enrichment-requests.csv',\n },\n { argsIndent: 5 },\n )}\n\n2. Fill out the CSV with additional identifiers\n\n3. Push updated back to Transcend:\n\n ${buildExampleCommand<PushIdentifiersCommandFlags>(\n ['request', 'preflight', 'push-identifiers'],\n {\n file: './enrichment-requests.csv',\n },\n { argsIndent: 5 },\n )}`,\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../../lib/cli/parsers.js';\nimport { buildExampleCommand } from '../../../../lib/docgen/buildExamples.js';\nimport type { PullIdentifiersCommandFlags } from '../pull-identifiers/impl.js';\nimport type { PushIdentifiersCommandFlags } from './impl.js';\n\nexport const pushIdentifiersCommand = buildCommand({\n loader: async () => {\n const { pushIdentifiers } = await import('./impl.js');\n return pushIdentifiers;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestIdentities, ScopeName.ManageRequestCompilation],\n }),\n enricherId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the Request Enricher to upload to',\n },\n sombraAuth: createSombraAuthParameter(),\n transcendUrl: createTranscendUrlParameter(),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file where requests will be written to',\n default: './manual-enrichment-identifiers.csv',\n },\n markSilent: {\n kind: 'boolean',\n brief: 'When true, set requests into silent mode before enriching',\n default: false,\n },\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '100',\n },\n },\n },\n docs: {\n brief: 'Push identifiers for manual enrichment',\n fullDescription: `This command push up a set of identifiers for a set of requests pending manual enrichment.\n\nThis is useful for the following workflow:\n\n1. Pull identifiers to CSV:\n\n ${buildExampleCommand<PullIdentifiersCommandFlags>(\n ['request', 'preflight', 'pull-identifiers'],\n {\n file: './enrichment-requests.csv',\n },\n { argsIndent: 5 },\n )}\n\n2. Fill out the CSV with additional identifiers\n\n3. Push updated back to Transcend:\n\n ${buildExampleCommand<PushIdentifiersCommandFlags>(\n ['request', 'preflight', 'push-identifiers'],\n {\n file: './enrichment-requests.csv',\n },\n { argsIndent: 5 },\n )}`,\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { pullIdentifiersCommand } from './pull-identifiers/command.js';\nimport { pushIdentifiersCommand } from './push-identifiers/command.js';\n\nexport const preflightRoutes = buildRouteMap({\n routes: {\n 'pull-identifiers': pullIdentifiersCommand,\n 'push-identifiers': pushIdentifiersCommand,\n },\n docs: {\n brief: 'Preflight commands',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { RequestAction, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const rejectUnverifiedIdentifiersCommand = buildCommand({\n loader: async () => {\n const { rejectUnverifiedIdentifiers } = await import('./impl.js');\n return rejectUnverifiedIdentifiers;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestCompilation],\n }),\n identifierNames: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'The names of identifiers to clear out',\n },\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request action to restart',\n optional: true,\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Bulk clear out any request identifiers that are unverified',\n fullDescription: 'Bulk clear out any request identifiers that are unverified.',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport {\n RequestAction,\n RequestStatus,\n RestartIdentifierStrategy,\n ScopeName,\n} from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\nimport { dateParser } from '../../../lib/cli/parsers.js';\n\nexport const restartCommand = buildCommand({\n loader: async () => {\n const { restart } = await import('./impl.js');\n return restart;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.MakeDataSubjectRequest, ScopeName.ViewRequestCompilation],\n }),\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to restart',\n },\n statuses: {\n kind: 'enum',\n values: Object.values(RequestStatus),\n variadic: ',',\n brief: 'The request statuses to restart',\n },\n transcendUrl: createTranscendUrlParameter(),\n requestReceiptFolder: {\n kind: 'parsed',\n parse: String,\n brief: 'The path to the folder where receipts of each upload are stored',\n default: './privacy-request-upload-receipts',\n },\n sombraAuth: createSombraAuthParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '15',\n },\n requestIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'Specify the specific request IDs to restart',\n optional: true,\n },\n emailIsVerified: {\n kind: 'boolean',\n brief:\n 'Indicate whether the primary email address is verified. Set to false to send a verification email',\n default: true,\n },\n createdAt: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were submitted before a specific date',\n optional: true,\n },\n silentModeBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Requests older than this date should be marked as silent mode',\n optional: true,\n },\n createdAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were submitted before this time',\n optional: true,\n },\n createdAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were submitted after this time',\n optional: true,\n },\n updatedAtBefore: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were last updated before this time',\n optional: true,\n },\n updatedAtAfter: {\n kind: 'parsed',\n parse: dateParser,\n brief: 'Restart requests that were last updated after this time',\n optional: true,\n },\n sendEmailReceipt: {\n kind: 'boolean',\n brief: 'Send email receipts to the restarted requests',\n default: false,\n },\n copyIdentifiers: {\n kind: 'boolean',\n brief: 'Copy over all enriched identifiers from the initial request',\n default: false,\n },\n restartIdentifierStrategy: {\n kind: 'enum',\n values: Object.values(RestartIdentifierStrategy),\n brief: 'How request identifiers should be handled when restarting',\n optional: true,\n },\n skipWaitingPeriod: {\n kind: 'boolean',\n brief: 'Skip queued state of request and go straight to compiling',\n default: false,\n },\n },\n },\n docs: {\n brief: 'Bulk update a set of privacy requests based on a set of request filters',\n fullDescription: 'Bulk update a set of privacy requests based on a set of request filters.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const skipPreflightJobsCommand = buildCommand({\n loader: async () => {\n const { skipPreflightJobs } = await import('./impl.js');\n return skipPreflightJobs;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestCompilation],\n }),\n enricherIds: {\n kind: 'parsed',\n parse: String,\n variadic: ',',\n brief: 'The ID of the enrichers to skip privacy request jobs for',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Skip preflight jobs',\n fullDescription: 'This command allows for bulk skipping preflight checks.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../../lib/cli/parsers.js';\n\nexport const markRequestDataSilosCompletedCommand = buildCommand({\n loader: async () => {\n const { markRequestDataSilosCompleted } = await import('./impl.js');\n return markRequestDataSilosCompleted;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestCompilation],\n }),\n dataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the data silo to pull in',\n },\n file: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Path to the CSV file where identifiers will be written to. The CSV is expected to have 1 column named \"Request Id\".',\n default: './request-identifiers.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Mark request data silos as completed',\n fullDescription: `This command takes in a CSV of Request IDs as well as a Data Silo ID and marks all associated privacy request jobs as completed.\nThis command is useful with the \"Bulk Response\" UI. The CSV is expected to have 1 column named \"Request Id\".`,\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport { RequestAction, ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../../lib/cli/parsers.js';\n\nexport const retryRequestDataSilosCommand = buildCommand({\n loader: async () => {\n const { retryRequestDataSilos } = await import('./impl.js');\n return retryRequestDataSilos;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestCompilation],\n }),\n dataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the data silo to pull in',\n },\n actions: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief: 'The request actions to restart',\n },\n transcendUrl: createTranscendUrlParameter(),\n },\n },\n docs: {\n brief: 'Retry request data silos',\n fullDescription:\n 'This command allows for bulk restarting a set of data silos jobs for open privacy requests. This is equivalent to clicking the \"Wipe and Retry\" button for a particular data silo across a set of privacy requests.',\n },\n});\n","import { buildCommand } from '@stricli/core';\nimport {\n RequestAction,\n RequestDataSiloStatus,\n RequestStatus,\n ScopeName,\n} from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../../lib/cli/common-parameters.js';\nimport { uuidParser } from '../../../../lib/cli/parsers.js';\n\nexport const skipRequestDataSilosCommand = buildCommand({\n loader: async () => {\n const { skipRequestDataSilos } = await import('./impl.js');\n return skipRequestDataSilos;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [ScopeName.ManageRequestCompilation],\n }),\n dataSiloId: {\n kind: 'parsed',\n parse: uuidParser,\n brief: 'The ID of the data silo to skip privacy request jobs for',\n },\n transcendUrl: createTranscendUrlParameter(),\n statuses: {\n kind: 'enum',\n values: Object.values(RequestStatus),\n variadic: ',',\n brief: 'The request statuses to skip',\n },\n status: {\n kind: 'enum',\n values: [RequestDataSiloStatus.Skipped, RequestDataSiloStatus.Resolved],\n brief: 'The status to set the request data silo job to',\n default: RequestDataSiloStatus.Skipped,\n },\n actionTypes: {\n kind: 'enum',\n values: Object.values(RequestAction),\n variadic: ',',\n brief:\n 'Filter by request action types (e.g. ACCESS,ERASURE). ' +\n 'Only request data silo jobs for these action types will be skipped.',\n optional: true,\n },\n },\n },\n docs: {\n brief: 'Skip request data silos',\n fullDescription:\n 'This command allows for bulk skipping all open privacy request jobs for a particular data silo. ' +\n 'This command is useful if you want to disable a data silo and then clear out any active privacy ' +\n 'requests that are still queued up for that data silo. ' +\n 'Use --actionTypes to target specific data actions (e.g. only ERASURE jobs).',\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { markRequestDataSilosCompletedCommand } from './mark-request-data-silos-completed/command.js';\nimport { retryRequestDataSilosCommand } from './retry-request-data-silos/command.js';\nimport { skipRequestDataSilosCommand } from './skip-request-data-silos/command.js';\n\nexport const systemRoutes = buildRouteMap({\n routes: {\n 'mark-request-data-silos-completed': markRequestDataSilosCompletedCommand,\n 'retry-request-data-silos': retryRequestDataSilosCommand,\n 'skip-request-data-silos': skipRequestDataSilosCommand,\n },\n docs: {\n brief: 'System commands',\n },\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport {\n createAuthParameter,\n createSombraAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\n\nexport const uploadCommand = buildCommand({\n loader: async () => {\n const { upload } = await import('./impl.js');\n return upload;\n },\n parameters: {\n flags: {\n auth: createAuthParameter({\n scopes: [\n ScopeName.MakeDataSubjectRequest,\n ScopeName.ViewRequestIdentitySettings,\n ScopeName.ViewGlobalAttributes,\n ],\n }),\n file: {\n kind: 'parsed',\n parse: String,\n brief: 'Path to the CSV file of requests to upload',\n default: './requests.csv',\n },\n transcendUrl: createTranscendUrlParameter(),\n cacheFilepath: {\n kind: 'parsed',\n parse: String,\n brief:\n 'The path to the JSON file encoding the metadata used to map the CSV shape to Transcend API',\n default: './transcend-privacy-requests-cache.json',\n },\n requestReceiptFolder: {\n kind: 'parsed',\n parse: String,\n brief: 'The path to the folder where receipts of each upload are stored',\n default: './privacy-request-upload-receipts',\n },\n sombraAuth: createSombraAuthParameter(),\n concurrency: {\n kind: 'parsed',\n parse: numberParser,\n brief: 'The concurrency to use when uploading requests in parallel',\n default: '50',\n },\n attributes: {\n kind: 'parsed',\n parse: String,\n brief:\n 'Tag all of the requests with the following attributes. Format: key1:value1;value2,key2:value3;value4',\n default: 'Tags:transcend-cli',\n },\n isTest: {\n kind: 'boolean',\n brief: 'Flag whether the requests being uploaded are test requests or regular requests',\n default: false,\n },\n isSilent: {\n kind: 'boolean',\n brief: 'Flag whether the requests being uploaded should be submitted in silent mode',\n default: true,\n },\n skipSendingReceipt: {\n kind: 'boolean',\n brief: 'Flag whether to skip sending of the receipt email',\n default: false,\n },\n emailIsVerified: {\n kind: 'boolean',\n brief:\n 'Indicate whether the email address being uploaded is pre-verified. Set to false to send a verification email',\n default: true,\n },\n skipFilterStep: {\n kind: 'boolean',\n brief: 'When true, skip the interactive step to filter down the CSV',\n default: false,\n },\n dryRun: {\n kind: 'boolean',\n brief:\n 'When true, perform a dry run of the upload instead of calling the API to submit the requests',\n default: false,\n },\n debug: {\n kind: 'boolean',\n brief: 'Debug logging',\n default: false,\n },\n defaultPhoneCountryCode: {\n kind: 'parsed',\n parse: String,\n brief:\n 'When uploading phone numbers, if the phone number is missing a country code, assume this country code',\n default: '1',\n },\n },\n },\n docs: {\n brief: 'Upload a set of requests from a CSV',\n fullDescription: `Upload a set of requests from a CSV.\n\nThis command prompts you to map the shape of the CSV to the shape of the Transcend API. There is no requirement for the shape of the incoming CSV, as the script will handle the mapping process.\n\nThe script will also produce a JSON cache file that allows for the mappings to be preserved between runs.`,\n },\n});\n","import { buildRouteMap } from '@stricli/core';\n\nimport { approveCommand } from './approve/command.js';\nimport { cancelCommand } from './cancel/command.js';\nimport { cronRoutes } from './cron/routes.js';\nimport { downloadFilesCommand } from './download-files/command.js';\nimport { enricherRestartCommand } from './enricher-restart/command.js';\nimport { exportCommand } from './export/command.js';\nimport { markSilentCommand } from './mark-silent/command.js';\nimport { notifyAdditionalTimeCommand } from './notify-additional-time/command.js';\nimport { preflightRoutes } from './preflight/routes.js';\nimport { rejectUnverifiedIdentifiersCommand } from './reject-unverified-identifiers/command.js';\nimport { restartCommand } from './restart/command.js';\nimport { skipPreflightJobsCommand } from './skip-preflight-jobs/command.js';\nimport { systemRoutes } from './system/routes.js';\nimport { uploadCommand } from './upload/command.js';\n\nexport const requestRoutes = buildRouteMap({\n routes: {\n approve: approveCommand,\n upload: uploadCommand,\n 'download-files': downloadFilesCommand,\n cancel: cancelCommand,\n restart: restartCommand,\n 'notify-additional-time': notifyAdditionalTimeCommand,\n 'mark-silent': markSilentCommand,\n 'enricher-restart': enricherRestartCommand,\n 'reject-unverified-identifiers': rejectUnverifiedIdentifiersCommand,\n export: exportCommand,\n 'skip-preflight-jobs': skipPreflightJobsCommand,\n system: systemRoutes,\n preflight: preflightRoutes,\n cron: cronRoutes,\n },\n docs: {\n brief: 'All commands related to DSR requests',\n },\n});\n","import { buildInstallCommand, buildUninstallCommand } from '@stricli/auto-complete';\nimport { buildApplication, buildRouteMap, text_en } from '@stricli/core';\n\nimport { adminRoutes } from './commands/admin/routes.js';\nimport { consentRoutes } from './commands/consent/routes.js';\nimport { customFunctionsRoutes } from './commands/custom-functions/routes.js';\nimport { inventoryRoutes } from './commands/inventory/routes.js';\nimport { migrationRoutes } from './commands/migration/routes.js';\nimport { formatCliException } from './commands/policy/helpers/policyEngineCliError.js';\nimport { policyRoutes } from './commands/policy/routes.js';\nimport { requestRoutes } from './commands/request/routes.js';\nimport { description, name, version } from './constants.js';\n\nconst routes = buildRouteMap({\n routes: {\n request: requestRoutes,\n consent: consentRoutes,\n 'custom-functions': customFunctionsRoutes,\n inventory: inventoryRoutes,\n admin: adminRoutes,\n migration: migrationRoutes,\n policy: policyRoutes,\n install: buildInstallCommand('@transcend-io/transcend', {\n bash: '__@transcend-io/cli_bash_complete',\n }),\n uninstall: buildUninstallCommand('@transcend-io/transcend', { bash: true }),\n },\n docs: {\n brief: description,\n hideRoute: {\n install: true,\n uninstall: true,\n },\n },\n});\n\nexport const app = buildApplication(routes, {\n name,\n versionInfo: {\n currentVersion: version,\n },\n localization: {\n loadText: (locale) => {\n if (!locale.startsWith('en')) {\n return undefined;\n }\n\n return {\n ...text_en,\n formatException: formatCliException,\n };\n },\n },\n});\n"],"mappings":"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AsB,MAAM,OAAO,uBAC3C,OAAO,GAET,WAAY,CACV,MAAO,CACL,KAAM,EAAoB,CACxB,OAAQ,CACN,EAAU,wBACV,EAAU,mCACV,EAAU,4BACX,CACF,CAAC,CACF,UAAW,CACT,KAAM,SACN,MAAO,OACP,MAAO,uDACR,CACD,WAAY,GAA2B,CACvC,aAAc,GAA6B,CAC3C,KAAM,CACJ,KAAM,SACN,MAAO,OACP,MAAO,gDACP,SAAU,GACX,CACD,UAAW,CACT,KAAM,SACN,MAAO,OACP,MAAO,8DACP,SAAU,GACX,CACD,OAAQ,CACN,KAAM,UACN,MACE,kGACF,QAAS,GACV,CACD,wBAAyB,CACvB,KAAM,UACN,MACE,yFACF,QAAS,GACV,CACD,eAAgB,CACd,KAAM,SACN,MAAO,OACP,MAAO,6DACP,QAAS,aACV,CACD,qBAAsB,CACpB,KAAM,UACN,MAAO,uEACP,QAAS,GACV,CACD,sBAAuB,CACrB,KAAM,UACN,MAAO,kEACP,QAAS,GACV,CACD,oBAAqB,CACnB,KAAM,UACN,MACE,oGACF,QAAS,GACV,CACD,SAAU,CACR,KAAM,UACN,MAAO,8CACP,QAAS,GACV,CACD,WAAY,CACV,KAAM,SACN,MAAO,OACP,MACE,4FACF,QAAS,0CACV,CACD,gBAAiB,CACf,KAAM,SACN,MAAO,OACP,MAAO,6CACP,QAAS,+CACV,CACD,YAAa,CACX,KAAM,SACN,MAAO,EACP,MAAO,oDACP,QAAS,KACV,CACF,CACF,CACD,KAAM,CACJ,MAAO,6DACP,gBAAiB;;;;2GAKlB,CACF,CCvFyB,CACtB,4BAA6B,EAC9B,CACD,KAAM,CACJ,MAAO,mBACR,CACF,CAAC,CC3BW,EAAe,EAAa,CACvC,OAAQ,SAAY,CAClB,GAAM,CAAE,SAAU,MAAM,OAAO,uBAC/B,OAAO,GAET,WAAY,CACV,MAAO,CACL,SAAU,CACR,KAAM,SACN,MAAO,OACP,MAAO,wEACP,SAAU,GACX,CACD,UAAW,CACT,KAAM,SACN,MAAO,OACP,MAAO,0DACP,QAAS,GACV,CACD,IAAK,CACH,KAAM,UACN,MAAO,qDACP,QAAS,GACV,CACD,cAAe,CACb,KAAM,UACN,MAAO,+CACP,QAAS,GACV,CACD,KAAM,CACJ,KAAM,UACN,MAAO,+DACP,QAAS,GACV,CACF,CACD,WAAY,CACV,KAAM,QACN,WAAY,CACV,CACE,MAAO,oCACP,YAAa,YACb,MAAO,OACP,SAAU,GACV,QAAS,6BACV,CACF,CACF,CACF,CACD,KAAM,CACJ,MAAO,+DACP,gBACE,wKACH,CACF,CAAC,CCHWA,EAAc,EAAa,CACtC,OAAQ,SAAY,CAClB,GAAM,CAAE,QAAS,MAAM,OAAO,uBAC9B,OAAO,GAET,WAAY,CACV,MAAO,CAtDT,SAAU,CACR,KAAM,SACN,MAAO,OACP,MAAO,wEACP,SAAU,GACX,CACD,KAAM,CACJ,KAAM,UACN,MAAO,kEACP,SAAU,GACX,CACD,OAAQ,CACN,KAAM,UACN,MAAO,+DACP,SAAU,GACX,CACD,MAAO,CACL,KAAM,UACN,MAAO,2DACP,SAAU,GACX,CACD,GAAI,CACF,KAAM,UACN,MAAO,iDACP,SAAU,GACX,CACD,cAAe,CACb,KAAM,UACN,MAAO,6DACP,QAAS,GACV,CACD,OAAQ,CACN,KAAM,UACN,MAAO,4CACP,QAAS,GACV,CACD,IAAK,CACH,KAAM,UACN,MAAO,wCACP,QAAS,GACV,CACD,KAAM,CACJ,KAAM,UACN,MAAO,6DACP,QAAS,GACV,CASQ,CACP,WAAY,CACV,KAAM,QACN,WAAY,CACV,CACE,MAAO,oCACP,YAAa,YACb,MAAO,OACP,SAAU,GACV,QAAS,6BACV,CACF,CACF,CACF,CACD,KAAM,CACJ,MAAO,6CACP,gBACE,wKACH,CACF,CAAC,CCrEW,EAAc,EAAa,CACtC,OAAQ,SAAY,CAClB,GAAM,CAAE,QAAS,MAAM,OAAO,uBAC9B,OAAO,GAET,WAAY,CACV,MAAO,CACL,KAAM,EAAoB,CACxB,OAAQ,CAAC,EAAU,YAAY,CAChC,CAAC,CACF,aAAc,GAA6B,CAC5C,CACF,CACD,KAAM,CACJ,MAAO,2CACP,gBACE,iIACH,CACF,CAAC,CCoBW,EAAa,EAAa,CACrC,OAAQ,SAAY,CAClB,GAAM,CAAE,QAAS,MAAM,OAAO,uBAC9B,OAAO,GAET,WAAY,CACV,MAAO,CA9CT,SAAU,CACR,KAAM,SACN,MAAO,OACP,MAAO,8CACP,SAAU,GACX,CACD,KAAM,CACJ,KAAM,SACN,MAAO,OACP,MAAO,gDACP,SAAU,GACX,CACD,SAAU,CACR,KAAM,OACN,OAAQ,EACR,MAAO,4CACP,SAAU,GACX,CACD,cAAe,CACb,KAAM,UACN,MAAO,6DACP,QAAS,GACV,CACD,OAAQ,CACN,KAAM,UACN,MAAO,4CACP,QAAS,GACV,CACD,IAAK,CACH,KAAM,UACN,MAAO,wCACP,QAAS,GACV,CACD,KAAM,CACJ,KAAM,UACN,MAAO,6DACP,QAAS,GACV,CASQ,CACP,WAAY,CACV,KAAM,QACN,WAAY,CACV,CACE,MAAO,oCACP,YAAa,YACb,MAAO,OACP,SAAU,GACV,QAAS,6BACV,CACF,CACF,CACF,CACD,KAAM,CACJ,MAAO,2DACP,gBACE,oOACH,CACF,CAAC,CC7DWC,EAAc,EAAa,CACtC,OAAQ,SAAY,CAClB,GAAM,CAAE,QAAS,MAAM,OAAO,uBAC9B,OAAO,GAET,WAAY,CACV,MAAO,CACL,KAAM,EAAoB,CACxB,OAAQ,CAAC,EAAU,cAAc,CAClC,CAAC,CACF,WAAY,GAA2B,CACvC,aAAc,GAA6B,CAC3C,KAAM,CACJ,KAAM,SACN,MAAO,OACP,MAAO,kDACP,QAAS,4BACV,CACD,UAAW,CACT,KAAM,SACN,MAAO,OACP,MACE,kHACF,QAAS,GACV,CACD,OAAQ,CACN,KAAM,UACN,MAAO,+DACP,QAAS,GACV,CACD,QAAS,CACP,KAAM,UACN,MACE,yHACF,QAAS,GACV,CACD,MAAO,CACL,KAAM,UACN,MACE,uIACF,QAAS,GACV,CACD,UAAW,CACT,KAAM,UACN,MACE,4JACF,QAAS,GACV,CACD,eAAgB,CACd,KAAM,UACN,MACE,+LACF,QAAS,GACV,CACD,SAAU,CACR,KAAM,SACN,MAAO,EACP,MACE,oNACF,SAAU,GACX,CACF,CACF,CACD,KAAM,CACJ,MAAO,kEACP,gBAAiB;;;;;;;;;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"}
@@ -1,9 +0,0 @@
1
- import{i as e}from"./enums-OiLcZ26O.mjs";import{a as t,o as n,s as r}from"./constants-XH8NIJGC.mjs";import{buildCommand as i,numberParser as a}from"@stricli/core";import{ConsentTrackerStatus as o,ScopeName as s,TRANSCEND_SCOPES as c}from"@transcend-io/privacy-types";import l from"ms";function u(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 Error(`Invalid UUID format: ${e}`);return e}function d(e){try{return new URL(e).toString().replace(/\/$/,``)}catch{throw Error(`Invalid URL format: ${e}`)}}function f(e){return e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0)}function p(e){let t=new Date(e);if(Number.isNaN(t.getTime()))throw TypeError(`Invalid date: ${e}. Try using the ISO 8601 format (YYYY-MM-DDTHH:MM:SS.SSSZ)`);return t}function m(e){if(typeof e==`number`&&Number.isFinite(e))return Math.round(e*1e3);if(typeof e==`string`){let t=e.trim();if(t===``)throw Error(`Invalid duration. Examples: "45", "2d", "1h", "90 minutes", "10s".`);let n=Number(t);if(t!==``&&Number.isFinite(n))return Math.round(n*1e3);let r;try{r=l(t)}catch{throw Error(`Invalid duration. Examples: "45", "2d", "1h", "90 minutes", "10s".`)}if(typeof r==`number`&&Number.isFinite(r))return r}throw Error(`Invalid duration. Examples: "45", "2d", "1h", "90 minutes", "10s".`)}const h=({scopes:e,requiresSiloScope:t=!1})=>{let r={kind:`parsed`,parse:String,brief:`The Transcend API key. Defaults to the TRANSCEND_API_KEY environment variable when set, so --auth may be omitted if it is exported.`,...n?{default:n}:{}};return t&&(r.brief+=` This key must be associated with the data silo(s) being operated on.`),e===`Varies`?{...r,brief:`${r.brief} The scopes required will vary depending on the operation performed. If in doubt, the ${c[s.FullAdmin].title} scope will always work.`}:e.length===0?{...r,brief:`${r.brief} No scopes are required for this command.`}:{...r,brief:`${r.brief} Requires scopes: ${e.map(e=>`"${c[e].title}"`).join(`, `)}`}},g=(e=t)=>({kind:`parsed`,parse:d,brief:`URL of the Transcend backend. Use https://api.us.transcend.io for US hosting. Defaults to the TRANSCEND_API_URL environment variable when set, so --transcendUrl may be omitted if it is exported.`,default:e}),_=(e=r)=>({kind:`parsed`,parse:d,brief:`URL of the Transcend consent backend. Use https://consent.us.transcend.io for US hosting. Defaults to the TRANSCEND_CONSENT_API_URL environment variable when set, so --consentUrl may be omitted if it is exported.`,default:e}),v=()=>({kind:`parsed`,parse:String,brief:`The Sombra internal key, use for additional authentication when self-hosting Sombra`,optional:!0}),y=[`dataSilos`,`enrichers`,`templates`,`apiKeys`],b=Object.values(o),x=i({loader:async()=>{let{pull:e}=await import(`./impl-BjoGaK1M.mjs`);return e},parameters:{flags:{auth:h({scopes:`Varies`}),resources:{kind:`enum`,values:[`all`,...Object.values(e)],brief:`The different resource types to pull in. Defaults to ${y.join(`,`)}.`,variadic:`,`,optional:!0},file:{kind:`parsed`,parse:String,brief:`Path to the YAML file to pull into`,default:`./transcend.yml`},transcendUrl:g(),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(o),variadic:`,`,brief:`The statuses of consent manager trackers to pull down. Defaults to all statuses.`,optional:!0},pageSize:{kind:`parsed`,parse:a,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{_ as a,f as c,u as d,h as i,p as l,y as n,v as o,x as r,g as s,b as t,m as u};
9
- //# sourceMappingURL=command-Ddx7b9ik.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-Ddx7b9ik.mjs","names":[],"sources":["../src/lib/cli/parsers.ts","../src/lib/cli/common-parameters.ts","../src/commands/inventory/pull/command.ts"],"sourcesContent":["import ms, { type StringValue as MsStringValue } from 'ms';\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 = /^[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\n/**\n * Parse a duration string to milliseconds.\n * Accepts concise/natural-ish strings (powered by `ms`) and returns milliseconds.\n * Examples: \"3600\", \"2d\", \"1h\", \"90 minutes\", \"10s\".\n *\n * @param input - The duration to parse\n * @returns The parsed duration in milliseconds\n * @throws Error if input is not a valid duration\n */\nexport function parseDurationToMs(input: unknown): number {\n if (typeof input === 'number' && Number.isFinite(input)) {\n // backward-compat: numbers => seconds\n return Math.round(input * 1000);\n }\n\n if (typeof input === 'string') {\n const trimmed = input.trim();\n // empty string → our standardized error (avoid ms throwing its own)\n if (trimmed === '') {\n throw new Error('Invalid duration. Examples: \"45\", \"2d\", \"1h\", \"90 minutes\", \"10s\".');\n }\n\n // bare numeric string => seconds (backward-compat)\n const asNumber = Number(trimmed);\n if (trimmed !== '' && Number.isFinite(asNumber)) {\n return Math.round(asNumber * 1000);\n }\n\n // let ms parse human strings\n let parsed: number | undefined;\n try {\n parsed = ms(trimmed as MsStringValue);\n } catch {\n // normalize ms' error to ours\n throw new Error('Invalid duration. Examples: \"45\", \"2d\", \"1h\", \"90 minutes\", \"10s\".');\n }\n if (typeof parsed === 'number' && Number.isFinite(parsed)) {\n return parsed;\n }\n }\n\n throw new Error('Invalid duration. Examples: \"45\", \"2d\", \"1h\", \"90 minutes\", \"10s\".');\n}\n","import type { TypedFlagParameter } from '@stricli/core';\nimport { ScopeName, TRANSCEND_SCOPES } from '@transcend-io/privacy-types';\n\nimport {\n DEFAULT_TRANSCEND_API,\n DEFAULT_TRANSCEND_API_KEY,\n DEFAULT_TRANSCEND_CONSENT_API,\n} from '../../constants.js';\nimport type { LocalContext } from '../../context.js';\nimport { urlParser } from './parsers.js';\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}): TypedFlagParameter<string, LocalContext> => {\n const parameter = {\n kind: 'parsed' as const,\n parse: String,\n brief:\n 'The Transcend API key. Defaults to the TRANSCEND_API_KEY environment variable when set, so --auth may be omitted if it is exported.',\n // When TRANSCEND_API_KEY is exported, make the flag optional by seeding a\n // default. When it is unset, omit `default` so the flag stays required.\n ...(DEFAULT_TRANSCEND_API_KEY ? { default: DEFAULT_TRANSCEND_API_KEY } : {}),\n };\n\n if (requiresSiloScope) {\n parameter.brief += ' 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): TypedFlagParameter<string, LocalContext> => ({\n kind: 'parsed',\n parse: urlParser,\n brief:\n 'URL of the Transcend backend. Use https://api.us.transcend.io for US hosting. Defaults to the TRANSCEND_API_URL environment variable when set, so --transcendUrl may be omitted if it is exported.',\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): TypedFlagParameter<string, LocalContext> => ({\n kind: 'parsed',\n parse: urlParser,\n brief:\n 'URL of the Transcend consent backend. Use https://consent.us.transcend.io for US hosting. Defaults to the TRANSCEND_CONSENT_API_URL environment variable when set, so --consentUrl may be omitted if it is exported.',\n default: defaultUrl,\n});\n\n/**\n * Creates a standard Sombra authentication parameter\n *\n * @returns The parameter object\n */\nexport const createSombraAuthParameter = (): TypedFlagParameter<\n string | undefined,\n LocalContext\n> => ({\n kind: 'parsed',\n parse: String,\n brief: 'The Sombra internal key, use for additional authentication when self-hosting Sombra',\n optional: true,\n});\n","import { buildCommand, numberParser } from '@stricli/core';\nimport { ConsentTrackerStatus } from '@transcend-io/privacy-types';\n\nimport { TranscendPullResource } from '../../../enums.js';\nimport {\n createAuthParameter,\n createTranscendUrlParameter,\n} from '../../../lib/cli/common-parameters.js';\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 = Object.values(ConsentTrackerStatus);\n\nexport const pullCommand = buildCommand({\n loader: async () => {\n const { pull } = await import('./impl.js');\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: '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: '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: 'When true, skip pulling in datapoints alongside data silo resource',\n default: false,\n },\n skipSubDatapoints: {\n kind: 'boolean',\n brief: 'When true, skip pulling in subDatapoints alongside data silo resource',\n default: false,\n },\n includeGuessedCategories: {\n kind: 'boolean',\n brief: 'When true, included guessed data categories that came from the content classifier',\n default: false,\n },\n debug: {\n kind: 'boolean',\n brief: '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"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import"./enums-OiLcZ26O.mjs";import{ScopeName as e,TRANSCEND_SCOPES as t}from"@transcend-io/privacy-types";import{keyBy as n}from"lodash-es";var r=`10.29.3`,i=`A command line interface for programmatic operations across Transcend.`;const a=`transcend`,o=`https://app.transcend.io`,s=`${o}/infrastructure/integrations`,c=`${o}/data-map/data-inventory/data-points`,l=process.env.TRANSCEND_API_URL||`https://api.transcend.io`,u=process.env.TRANSCEND_API_KEY||void 0,d=process.env.TRANSCEND_CONSENT_API_URL||`https://consent.transcend.io`,f={apiKeys:[e.ViewApiKeys],templates:[e.ManageEmailTemplates],dataSilos:[e.ManageDataMap,e.ConnectDataSilos,e.ViewApiKeys],enrichers:[e.ManageRequestIdentities],businessEntities:[e.ManageDataInventory],processingActivities:[e.ManageDataMap],identifiers:[e.ManageRequestIdentities],customFields:[e.ManageGlobalAttributes],dataFlows:[e.ManageDataFlow],cookies:[e.ManageDataFlow],consentManager:[e.ManageConsentManagerDeveloperSettings],partitions:[e.ManageConsentManagerDeveloperSettings],actions:[e.ManageDataSubjectRequestSettings],dataSubjects:[e.ManageDataSubjectRequestSettings],vendors:[e.ManageDataInventory],dataCategories:[e.ManageDataInventory],processingPurposes:[e.ManageDataInventory],actionItems:[e.ManageAllActionItems,e.ViewGlobalAttributes],actionItemCollections:[e.ManageActionItemCollections],teams:[e.ManageAccessControl],messages:[e.ManageIntlMessages],privacyCenters:[e.ManagePrivacyCenter],policies:[e.ManagePolicies],assessments:[e.ManageAssessments],assessmentTemplates:[e.ManageAssessments],purposes:[e.ManageConsentManager,e.ManagePreferenceStoreSettings],preferenceOptions:[e.ManagePreferenceStoreSettings],systemDiscovery:[e.ManageDataMap],preferenceWorkflowConfigs:[e.ManagePreferenceStoreSettings,e.ViewDataSubjectRequestSettings,e.ViewConsentManager,e.ViewDataMap,e.ManageWorkflows],workflowConfigs:[e.ManageWorkflows]},p={apiKeys:[e.ViewApiKeys],templates:[e.ViewEmailTemplates],dataSilos:[e.ViewDataMap,e.ViewDataSubjectRequestSettings,e.ViewApiKeys],enrichers:[e.ViewRequestIdentitySettings],businessEntities:[e.ViewDataInventory],processingActivities:[e.ViewDataInventory],identifiers:[e.ViewRequestIdentitySettings],customFields:[e.ViewGlobalAttributes],dataFlows:[e.ViewDataFlow],cookies:[e.ViewDataFlow],consentManager:[e.ViewConsentManager],partitions:[e.ViewConsentManager],actions:[e.ViewDataSubjectRequestSettings],dataSubjects:[e.ViewDataSubjectRequestSettings],vendors:[e.ViewDataInventory],dataCategories:[e.ViewDataInventory],processingPurposes:[e.ViewDataInventory],actionItemCollections:[e.ViewAllActionItems],actionItems:[e.ViewAllActionItems],teams:[e.ViewScopes],messages:[e.ViewIntlMessages],privacyCenters:[e.ViewPrivacyCenter],policies:[e.ViewPolicies],assessments:[e.ViewAssessments],assessmentTemplates:[e.ViewAssessments],purposes:[e.ViewConsentManager,e.ViewPreferenceStoreSettings],preferenceOptions:[e.ViewPreferenceStoreSettings],systemDiscovery:[e.ViewDataMap],preferenceWorkflowConfigs:[e.ViewPreferenceStoreSettings,e.ManageWorkflows],workflowConfigs:[e.ViewWorkflows]},m={apiKeys:`api-keys`,customFields:`attributes`,dataFlows:`data-flows`,cookies:`cookies`,consentManager:`consent-manager`,partitions:`partitions`,actions:`actions`,dataSubjects:`data-subjects`,businessEntities:`business-entities`,processingActivities:`processing-activities`,identifiers:`identifiers`,enrichers:`preflights`,dataSilos:`data-silos`,templates:`templates`,vendors:`vendors`,dataCategories:`data-categories`,processingPurposes:`processing-purposes`,actionItems:`action-items`,actionItemCollections:`action-item-collections`,teams:`teams`,messages:`messages`,privacyCenters:`privacy-center`,policies:`policies`,assessments:`assessments`,assessmentTemplates:`assessment-templates`,purposes:`purposes`,preferenceOptions:`preference-options`,systemDiscovery:`system-discovery`,preferenceWorkflowConfigs:`preference-workflow-configs`,workflowConfigs:`workflow-configs`},h=n(Object.entries(t).map(([e,t])=>({...t,name:e})),`title`),g=Object.keys(h),_=new Set([429,502,500,504,329]),v=process.env.DEBUG===`1`;export{l as a,_ as c,p as d,f,r as g,i as h,v as i,h as l,a as m,c as n,u as o,m as p,s as r,d as s,o as t,g as u};
2
- //# sourceMappingURL=constants-XH8NIJGC.mjs.map
@@ -1,2 +0,0 @@
1
- import{a as e,i as t,m as n,o as r,p as i,s as a}from"./prompts-ClBXdELk.mjs";import{r as o}from"./manifest-BNIpO_zW.mjs";import{dirname as s,extname as c,isAbsolute as l,join as u,relative as d,resolve as f,sep as p}from"node:path";function m(e,t){return l(t)?f(t):f(e,t)}function h(e,t){let n=m(e,`transcend/custom-functions`),r=t.manifest!==void 0&&t.directory===`transcend/custom-functions`,i=t.directory&&!r?m(e,t.directory):n,a=t.manifest?m(e,t.manifest):u(i,`transcend-functions.yml`),o=s(a),c=t.directory&&!r?i:t.manifest?o:n,f=d(c,a);if(t.directory&&!r&&(f===`..`||f.startsWith(`..${p}`)||l(f)))throw Error(`The manifest must be inside the Custom Function project directory. Received directory ${c} and manifest ${a}.`);return{targetDirectory:c,manifestDirectory:o,manifestPath:a}}function g(e){return e.length===0?``:` --variables=${n(e.map(e=>`${e}:placeholder`).join(`,`))}`}function _(e,t,r){let a=u(e,`transcend-functions.yml`),o=r?i(r,e):e,s=r?i(r,t):t,c=t===a?``:` --manifest=${n(s)}`;return`${n(o)}${c}`}function v(e,t){let n=r(e,t),i=a(e,n)??n,s=[],l=t=>{e.fs.readdirSync(t,{withFileTypes:!0}).forEach(n=>{if(n.name===`.git`||n.name===`.worktrees`||n.name===`node_modules`)return;let r=u(t,n.name);if(n.isDirectory()&&!n.isSymbolicLink())l(r);else if(n.isFile()){if(n.name===`transcend-functions.yml`){s.push(r);return}if([`.yml`,`.yaml`].includes(c(n.name)))try{if(e.fs.statSync(r).size>256e3)return;o(e.fs.readFileSync(r,`utf8`),{skipPathValidation:!0}),s.push(r)}catch{}}})};return l(i),s.sort((e,t)=>e.localeCompare(t))}function y(n,r){let i=n.process.cwd(),{manifestDirectory:a,manifestPath:o,targetDirectory:s}=h(i,r),c=e(n,{invocationDirectory:i,targetDirectory:s,standaloneProjectRoot:s===f(i,`transcend/custom-functions`)?i:s}),l=u(a,`deno.jsonc`),d=u(a,`deno.json`),p=n.fs.existsSync(l)?l:d;return{invocationDirectory:i,targetDirectory:s,...c,manifestDirectory:a,manifestPath:o,denoConfigPath:p,relativePaths:t(n,a)}}const b=`2.4.5`,x=`https://docs.deno.com/runtime/getting_started/installation/`;function S(e){let t=e.match(/^deno\s+((\d+)\.\d+\.\d+(?:[-+][^\s]+)?)(?:\s|$)/mu);if(t)return{version:t[1],major:Number(t[2])}}function C(e){let t=S(e);return t?t.major===2?t.version===`2.4.5`?{level:`compatible`}:{level:`warning`,message:`Deno ${t.version} is compatible, but ${b} matches the current production runtime.`}:{level:`error`,message:`Deno 2.x is required; found ${t.version}. Install or switch versions using ${x}`}:{level:`error`,message:`Deno 2.x is required, but the installed version could not be determined. Install or switch versions using ${x}`}}export{y as a,h as c,v as i,b as n,_ as o,C as r,g as s,x as t};
2
- //# sourceMappingURL=deno-runtime-DV52X8-P.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deno-runtime-DV52X8-P.mjs","names":[],"sources":["../src/lib/custom-functions/paths.ts","../src/lib/custom-functions/project-discovery.ts","../src/lib/custom-functions/deno-runtime.ts"],"sourcesContent":["import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';\n\nimport { displayProjectPath, quoteShellArgument } from '../scaffolding/project-plan-output.js';\n\n/** Default local Custom Function project directory. */\nexport const DEFAULT_CUSTOM_FUNCTION_DIRECTORY = 'transcend/custom-functions';\n\n/**\n * Resolve a possibly relative CLI input against a working directory.\n *\n * @param cwd - Process working directory\n * @param input - User path\n * @returns Absolute path\n */\nexport function resolveCliPath(cwd: string, input: string): string {\n return isAbsolute(input) ? resolve(input) : resolve(cwd, input);\n}\n\n/**\n * Resolve one Custom Function project and its optional manifest override.\n *\n * @param cwd - Process working directory\n * @param options - User-provided paths\n * @returns Consistent absolute project paths\n */\nexport function resolveCustomFunctionProjectPaths(\n cwd: string,\n options: {\n /** Optional positional project directory. */\n directory?: string;\n /** Optional explicit manifest path. */\n manifest?: string;\n },\n): {\n /** Project directory selected by the positional argument. */\n targetDirectory: string;\n /** Directory containing the manifest. */\n manifestDirectory: string;\n /** Absolute manifest path. */\n manifestPath: string;\n} {\n const defaultTarget = resolveCliPath(cwd, DEFAULT_CUSTOM_FUNCTION_DIRECTORY);\n const positionalIsFrameworkDefault =\n options.manifest !== undefined && options.directory === DEFAULT_CUSTOM_FUNCTION_DIRECTORY;\n const requestedTarget =\n options.directory && !positionalIsFrameworkDefault\n ? resolveCliPath(cwd, options.directory)\n : defaultTarget;\n const manifestPath = options.manifest\n ? resolveCliPath(cwd, options.manifest)\n : join(requestedTarget, 'transcend-functions.yml');\n const manifestDirectory = dirname(manifestPath);\n const targetDirectory =\n options.directory && !positionalIsFrameworkDefault\n ? requestedTarget\n : options.manifest\n ? manifestDirectory\n : defaultTarget;\n const manifestRelativeToTarget = relative(targetDirectory, manifestPath);\n if (\n options.directory &&\n !positionalIsFrameworkDefault &&\n (manifestRelativeToTarget === '..' ||\n manifestRelativeToTarget.startsWith(`..${sep}`) ||\n isAbsolute(manifestRelativeToTarget))\n ) {\n throw new Error(\n `The manifest must be inside the Custom Function project directory. ` +\n `Received directory ${targetDirectory} and manifest ${manifestPath}.`,\n );\n }\n return { targetDirectory, manifestDirectory, manifestPath };\n}\n\n/**\n * Build a CLI variables argument with non-secret values suitable for local checks.\n *\n * @param variableNames - Manifest placeholder names\n * @returns Empty string or a leading-space-prefixed CLI argument\n */\nexport function buildPlaceholderVariablesArgument(variableNames: readonly string[]): string {\n if (variableNames.length === 0) {\n return '';\n }\n const value = variableNames.map((name) => `${name}:placeholder`).join(',');\n return ` --variables=${quoteShellArgument(value)}`;\n}\n\n/**\n * Build project arguments for a generated Custom Function command.\n *\n * @param targetDirectory - Project directory\n * @param manifestPath - Explicit manifest\n * @param cwd - Optional invocation directory for shorter human-readable paths\n * @returns Quoted positional directory and any required manifest override\n */\nexport function buildCustomFunctionProjectArguments(\n targetDirectory: string,\n manifestPath: string,\n cwd?: string,\n): string {\n const defaultManifest = join(targetDirectory, 'transcend-functions.yml');\n const displayedTarget = cwd ? displayProjectPath(cwd, targetDirectory) : targetDirectory;\n const displayedManifest = cwd ? displayProjectPath(cwd, manifestPath) : manifestPath;\n const manifestFlag =\n manifestPath === defaultManifest ? '' : ` --manifest=${quoteShellArgument(displayedManifest)}`;\n return `${quoteShellArgument(displayedTarget)}${manifestFlag}`;\n}\n","import { extname, join, resolve } from 'node:path';\n\nimport type { LocalContext } from '../../context.js';\nimport {\n collectProjectRelativePaths,\n discoverProjectRepository,\n findExistingAncestor,\n findRepositoryRoot,\n} from '../scaffolding/project-discovery.js';\nimport { parseCustomFunctionsManifest } from './manifest.js';\nimport { DEFAULT_CUSTOM_FUNCTION_DIRECTORY, resolveCustomFunctionProjectPaths } from './paths.js';\nimport type { CustomFunctionProjectState } from './scaffold-model.js';\n\n/**\n * Find Custom Function manifests below the surrounding repository.\n *\n * @param context - CLI context\n * @param startDirectory - Existing directory from which to locate the repository\n * @returns Absolute manifest paths in stable order\n */\nexport function discoverCustomFunctionManifests(\n context: LocalContext,\n startDirectory: string,\n): string[] {\n const existingAncestor = findExistingAncestor(context, startDirectory);\n const root = findRepositoryRoot(context, existingAncestor) ?? existingAncestor;\n const manifests: string[] = [];\n const visit = (directory: string): void => {\n context.fs.readdirSync(directory, { withFileTypes: true }).forEach((entry) => {\n if (entry.name === '.git' || entry.name === '.worktrees' || entry.name === 'node_modules') {\n return;\n }\n const absolute = join(directory, entry.name);\n if (entry.isDirectory() && !entry.isSymbolicLink()) {\n visit(absolute);\n } else if (entry.isFile()) {\n if (entry.name === 'transcend-functions.yml') {\n manifests.push(absolute);\n return;\n }\n if (['.yml', '.yaml'].includes(extname(entry.name))) {\n try {\n if (context.fs.statSync(absolute).size > 256_000) {\n return;\n }\n parseCustomFunctionsManifest(context.fs.readFileSync(absolute, 'utf8'), {\n skipPathValidation: true,\n });\n manifests.push(absolute);\n } catch {\n // Most repository YAML files are not Custom Function manifests.\n }\n }\n }\n });\n };\n visit(root);\n return manifests.sort((left, right) => left.localeCompare(right));\n}\n\n/**\n * Collect all repository state required by the pure planners.\n *\n * @param context - CLI context\n * @param options - User-selected target paths\n * @returns Project state\n */\nexport function discoverCustomFunctionProject(\n context: LocalContext,\n options: {\n /** Optional positional directory. */\n directory?: string;\n /** Optional explicit manifest path. */\n manifest?: string;\n },\n): CustomFunctionProjectState {\n const cwd = context.process.cwd();\n const { manifestDirectory, manifestPath, targetDirectory } = resolveCustomFunctionProjectPaths(\n cwd,\n options,\n );\n const repository = discoverProjectRepository(context, {\n invocationDirectory: cwd,\n targetDirectory,\n standaloneProjectRoot:\n targetDirectory === resolve(cwd, DEFAULT_CUSTOM_FUNCTION_DIRECTORY) ? cwd : targetDirectory,\n });\n const denoJsonc = join(manifestDirectory, 'deno.jsonc');\n const denoJson = join(manifestDirectory, 'deno.json');\n const denoConfigPath = context.fs.existsSync(denoJsonc) ? denoJsonc : denoJson;\n\n return {\n invocationDirectory: cwd,\n targetDirectory,\n ...repository,\n manifestDirectory,\n manifestPath,\n denoConfigPath,\n relativePaths: collectProjectRelativePaths(context, manifestDirectory),\n };\n}\n","/** Deno version pinned in generated CI to match the current production runtime. */\nexport const RECOMMENDED_DENO_VERSION = '2.4.5';\n\n/** Deno major version supported by local Custom Function tooling. */\nexport const SUPPORTED_DENO_MAJOR_VERSION = 2;\n\n/** Official Deno installation instructions. */\nexport const DENO_INSTALL_URL = 'https://docs.deno.com/runtime/getting_started/installation/';\n\n/** Parsed Deno runtime version. */\nexport interface DenoRuntimeVersion {\n /** Complete semantic version reported by Deno. */\n version: string;\n /** Semantic major version. */\n major: number;\n}\n\n/** Compatibility result for one installed Deno runtime. */\nexport type DenoRuntimeCompatibility =\n | {\n /** Exact production match. */\n level: 'compatible';\n }\n | {\n /** Compatible major with a different production pin. */\n level: 'warning';\n /** Human-readable compatibility guidance. */\n message: string;\n }\n | {\n /** Unsupported or unreadable runtime version. */\n level: 'error';\n /** Human-readable requirement error. */\n message: string;\n };\n\n/**\n * Parse the first line of `deno --version`.\n *\n * @param output - Captured standard output\n * @returns Parsed runtime version\n */\nexport function parseDenoRuntimeVersion(output: string): DenoRuntimeVersion | undefined {\n const match = output.match(/^deno\\s+((\\d+)\\.\\d+\\.\\d+(?:[-+][^\\s]+)?)(?:\\s|$)/mu);\n if (!match) {\n return undefined;\n }\n return {\n version: match[1]!,\n major: Number(match[2]),\n };\n}\n\n/**\n * Compare an installed Deno runtime with the supported major and production pin.\n *\n * @param output - Captured `deno --version` output\n * @returns Compatibility and optional guidance\n */\nexport function getDenoRuntimeCompatibility(output: string): DenoRuntimeCompatibility {\n const runtime = parseDenoRuntimeVersion(output);\n if (!runtime) {\n return {\n level: 'error',\n message: `Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is required, but the installed version could not be determined. Install or switch versions using ${DENO_INSTALL_URL}`,\n };\n }\n if (runtime.major !== SUPPORTED_DENO_MAJOR_VERSION) {\n return {\n level: 'error',\n message: `Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is required; found ${runtime.version}. Install or switch versions using ${DENO_INSTALL_URL}`,\n };\n }\n if (runtime.version !== RECOMMENDED_DENO_VERSION) {\n return {\n level: 'warning',\n message: `Deno ${runtime.version} is compatible, but ${RECOMMENDED_DENO_VERSION} matches the current production runtime.`,\n };\n }\n return { level: 'compatible' };\n}\n"],"mappings":"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"}