@transcend-io/cli 12.1.5 → 13.0.2

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 (215) hide show
  1. package/README.md +64 -14
  2. package/dist/{app-BMLQABJX.mjs → app-CCGKgPiC.mjs} +19 -19
  3. package/dist/app-CCGKgPiC.mjs.map +1 -0
  4. package/dist/{approvePrivacyRequests-CY6rQT4J.mjs → approvePrivacyRequests-BBcqydVb.mjs} +2 -2
  5. package/dist/{approvePrivacyRequests-CY6rQT4J.mjs.map → approvePrivacyRequests-BBcqydVb.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-BNGtj-DW.mjs → buildExamples-DRU0o6EK.mjs} +2 -2
  10. package/dist/{buildExamples-BNGtj-DW.mjs.map → buildExamples-DRU0o6EK.mjs.map} +1 -1
  11. package/dist/{buildXdiSyncEndpoint-BNCfOc-g.mjs → buildXdiSyncEndpoint-CSjQKSn3.mjs} +2 -2
  12. package/dist/{buildXdiSyncEndpoint-BNCfOc-g.mjs.map → buildXdiSyncEndpoint-CSjQKSn3.mjs.map} +1 -1
  13. package/dist/{bulkRestartRequests-CGvODu3r.mjs → bulkRestartRequests-Cx5LfpdX.mjs} +2 -2
  14. package/dist/{bulkRestartRequests-CGvODu3r.mjs.map → bulkRestartRequests-Cx5LfpdX.mjs.map} +1 -1
  15. package/dist/{bulkRetryEnrichers-BgDd4GWH.mjs → bulkRetryEnrichers-BSJtvqJD.mjs} +2 -2
  16. package/dist/{bulkRetryEnrichers-BgDd4GWH.mjs.map → bulkRetryEnrichers-BSJtvqJD.mjs.map} +1 -1
  17. package/dist/{cancelPrivacyRequests-Ccsiwrnu.mjs → cancelPrivacyRequests-Cy48R4tJ.mjs} +2 -2
  18. package/dist/{cancelPrivacyRequests-Ccsiwrnu.mjs.map → cancelPrivacyRequests-Cy48R4tJ.mjs.map} +1 -1
  19. package/dist/codecs-8T8Jhxsr.mjs +2 -0
  20. package/dist/codecs-8T8Jhxsr.mjs.map +1 -0
  21. package/dist/{command-BjzdoKgJ.mjs → command-Gip5wB8W.mjs} +2 -2
  22. package/dist/{command-BjzdoKgJ.mjs.map → command-Gip5wB8W.mjs.map} +1 -1
  23. package/dist/constants-D6y_AX3P.mjs +2 -0
  24. package/dist/constants-D6y_AX3P.mjs.map +1 -0
  25. package/dist/{constants-FDjw7bPS.mjs → constants-DAx9VK1C.mjs} +2 -2
  26. package/dist/{constants-FDjw7bPS.mjs.map → constants-DAx9VK1C.mjs.map} +1 -1
  27. package/dist/{createPoolingCommandUi-BdtnLBBM.mjs → createPoolingCommandUi-DZx16Cn8.mjs} +2 -2
  28. package/dist/{createPoolingCommandUi-BdtnLBBM.mjs.map → createPoolingCommandUi-DZx16Cn8.mjs.map} +1 -1
  29. package/dist/{downloadPrivacyRequestFiles-C9-xSCpt.mjs → downloadPrivacyRequestFiles-DBeuW9b3.mjs} +2 -2
  30. package/dist/{downloadPrivacyRequestFiles-C9-xSCpt.mjs.map → downloadPrivacyRequestFiles-DBeuW9b3.mjs.map} +1 -1
  31. package/dist/fetchAllRequests-BV9K0wXv.mjs +2 -0
  32. package/dist/fetchAllRequests-BV9K0wXv.mjs.map +1 -0
  33. package/dist/{fuzzyMatchColumns-D18n9Beu.mjs → fuzzyMatchColumns-Djl3a7lV.mjs} +2 -2
  34. package/dist/{fuzzyMatchColumns-D18n9Beu.mjs.map → fuzzyMatchColumns-Djl3a7lV.mjs.map} +1 -1
  35. package/dist/{generateCrossAccountApiKeys-FtWwlf_L.mjs → generateCrossAccountApiKeys-CjmSyfwm.mjs} +2 -2
  36. package/dist/{generateCrossAccountApiKeys-FtWwlf_L.mjs.map → generateCrossAccountApiKeys-CjmSyfwm.mjs.map} +1 -1
  37. package/dist/{impl-Dg7XSQdO2.mjs → impl-7qTKg-YP2.mjs} +2 -2
  38. package/dist/{impl-Dg7XSQdO2.mjs.map → impl-7qTKg-YP2.mjs.map} +1 -1
  39. package/dist/{impl-D58JUOdA.mjs → impl-9W0QG6fB.mjs} +2 -2
  40. package/dist/{impl-D58JUOdA.mjs.map → impl-9W0QG6fB.mjs.map} +1 -1
  41. package/dist/{impl-B94dMG4x2.mjs → impl-B-BkGfqq2.mjs} +2 -2
  42. package/dist/{impl-B94dMG4x2.mjs.map → impl-B-BkGfqq2.mjs.map} +1 -1
  43. package/dist/{impl-yIVxAhCG2.mjs → impl-B8DsKzNn2.mjs} +2 -2
  44. package/dist/{impl-yIVxAhCG2.mjs.map → impl-B8DsKzNn2.mjs.map} +1 -1
  45. package/dist/impl-B9jwlKCX2.mjs +2 -0
  46. package/dist/impl-B9jwlKCX2.mjs.map +1 -0
  47. package/dist/{impl-C3vTm9zQ.mjs → impl-BIhXJ0Nw.mjs} +2 -2
  48. package/dist/{impl-C3vTm9zQ.mjs.map → impl-BIhXJ0Nw.mjs.map} +1 -1
  49. package/dist/{impl-B_N_fOq0.mjs → impl-BLM6rMBq.mjs} +2 -2
  50. package/dist/{impl-B_N_fOq0.mjs.map → impl-BLM6rMBq.mjs.map} +1 -1
  51. package/dist/{impl-Hj5CgbWd.mjs → impl-BPmzcgpy.mjs} +2 -2
  52. package/dist/{impl-Hj5CgbWd.mjs.map → impl-BPmzcgpy.mjs.map} +1 -1
  53. package/dist/{impl-COqlYiiw.mjs → impl-BUKV7sYp.mjs} +2 -2
  54. package/dist/{impl-COqlYiiw.mjs.map → impl-BUKV7sYp.mjs.map} +1 -1
  55. package/dist/{impl-DFnWzZyY.mjs → impl-BahDGEJJ.mjs} +2 -2
  56. package/dist/{impl-DFnWzZyY.mjs.map → impl-BahDGEJJ.mjs.map} +1 -1
  57. package/dist/{impl-qNF5eqX-.mjs → impl-BfU0GFmW.mjs} +1 -1
  58. package/dist/{impl-qNF5eqX-.mjs.map → impl-BfU0GFmW.mjs.map} +1 -1
  59. package/dist/{impl-DDVhG8Gf.mjs → impl-Bh1CkZhV.mjs} +2 -2
  60. package/dist/{impl-DDVhG8Gf.mjs.map → impl-Bh1CkZhV.mjs.map} +1 -1
  61. package/dist/{impl-BvwRiPSG.mjs → impl-BkQryDNq.mjs} +2 -2
  62. package/dist/{impl-BvwRiPSG.mjs.map → impl-BkQryDNq.mjs.map} +1 -1
  63. package/dist/{impl-bl6NF3Lr.mjs → impl-BsdneZZP.mjs} +2 -2
  64. package/dist/{impl-bl6NF3Lr.mjs.map → impl-BsdneZZP.mjs.map} +1 -1
  65. package/dist/{impl-D6rMLiNB2.mjs → impl-BuOc87b6.mjs} +2 -2
  66. package/dist/impl-BuOc87b6.mjs.map +1 -0
  67. package/dist/{impl-DUYRVzMo.mjs → impl-BzzkiK_b.mjs} +1 -1
  68. package/dist/{impl-DUYRVzMo.mjs.map → impl-BzzkiK_b.mjs.map} +1 -1
  69. package/dist/{impl-ClT3G845.mjs → impl-C2BYhujB.mjs} +2 -2
  70. package/dist/{impl-ClT3G845.mjs.map → impl-C2BYhujB.mjs.map} +1 -1
  71. package/dist/{impl-DnDM9zcu.mjs → impl-C5qif_gE.mjs} +2 -2
  72. package/dist/{impl-DnDM9zcu.mjs.map → impl-C5qif_gE.mjs.map} +1 -1
  73. package/dist/{impl-BLtOfbtk.mjs → impl-C8auyA7u.mjs} +2 -2
  74. package/dist/{impl-BLtOfbtk.mjs.map → impl-C8auyA7u.mjs.map} +1 -1
  75. package/dist/{impl-BEiCEzl_2.mjs → impl-CHoglMch.mjs} +1 -1
  76. package/dist/impl-CHoglMch.mjs.map +1 -0
  77. package/dist/{impl-QD3_9HTk.mjs → impl-CJ4oVuXN.mjs} +2 -2
  78. package/dist/{impl-QD3_9HTk.mjs.map → impl-CJ4oVuXN.mjs.map} +1 -1
  79. package/dist/{impl-DhXzxQDN2.mjs → impl-CRif3TpB2.mjs} +2 -2
  80. package/dist/{impl-DhXzxQDN2.mjs.map → impl-CRif3TpB2.mjs.map} +1 -1
  81. package/dist/{impl-Cvyc-iTI2.mjs → impl-CWINXCFq2.mjs} +2 -2
  82. package/dist/{impl-Cvyc-iTI2.mjs.map → impl-CWINXCFq2.mjs.map} +1 -1
  83. package/dist/{impl-Dd39KsYO.mjs → impl-C_lIkMLn2.mjs} +2 -2
  84. package/dist/impl-C_lIkMLn2.mjs.map +1 -0
  85. package/dist/{impl-EDwngLc7.mjs → impl-CcPwm8a4.mjs} +2 -2
  86. package/dist/{impl-EDwngLc7.mjs.map → impl-CcPwm8a4.mjs.map} +1 -1
  87. package/dist/{impl-DGtCNANL.mjs → impl-CjjiXsMh.mjs} +2 -2
  88. package/dist/{impl-DGtCNANL.mjs.map → impl-CjjiXsMh.mjs.map} +1 -1
  89. package/dist/{impl-BLOhoP-b2.mjs → impl-CzFfjx8n2.mjs} +2 -2
  90. package/dist/{impl-BLOhoP-b2.mjs.map → impl-CzFfjx8n2.mjs.map} +1 -1
  91. package/dist/{impl-BXGpJz21.mjs → impl-D6e2LNBm.mjs} +2 -2
  92. package/dist/{impl-BXGpJz21.mjs.map → impl-D6e2LNBm.mjs.map} +1 -1
  93. package/dist/{impl-SOebshza.mjs → impl-D8yF0jw9.mjs} +2 -2
  94. package/dist/{impl-SOebshza.mjs.map → impl-D8yF0jw9.mjs.map} +1 -1
  95. package/dist/{impl-DeCRXfAh2.mjs → impl-DEF-meSg2.mjs} +2 -2
  96. package/dist/{impl-DeCRXfAh2.mjs.map → impl-DEF-meSg2.mjs.map} +1 -1
  97. package/dist/{impl-DZoTWLfw2.mjs → impl-DEPuP4Oy2.mjs} +2 -2
  98. package/dist/{impl-DZoTWLfw2.mjs.map → impl-DEPuP4Oy2.mjs.map} +1 -1
  99. package/dist/impl-DGLrKNNs2.mjs +2 -0
  100. package/dist/impl-DGLrKNNs2.mjs.map +1 -0
  101. package/dist/{impl-XxYQHKO5.mjs → impl-DPq1O87s.mjs} +2 -2
  102. package/dist/{impl-XxYQHKO5.mjs.map → impl-DPq1O87s.mjs.map} +1 -1
  103. package/dist/{impl-ChQAmyBN.mjs → impl-DiaD11OP.mjs} +2 -2
  104. package/dist/{impl-ChQAmyBN.mjs.map → impl-DiaD11OP.mjs.map} +1 -1
  105. package/dist/{impl-0-_oxvck.mjs → impl-DioQW8jR.mjs} +2 -2
  106. package/dist/{impl-0-_oxvck.mjs.map → impl-DioQW8jR.mjs.map} +1 -1
  107. package/dist/{impl-D6frX-PK.mjs → impl-DjBbx05w.mjs} +2 -2
  108. package/dist/{impl-D6frX-PK.mjs.map → impl-DjBbx05w.mjs.map} +1 -1
  109. package/dist/{impl-BCKUj-ko.mjs → impl-DnBmd-wi.mjs} +2 -2
  110. package/dist/{impl-BCKUj-ko.mjs.map → impl-DnBmd-wi.mjs.map} +1 -1
  111. package/dist/{impl-Cp5o0Q2g.mjs → impl-Do3hnGHt.mjs} +2 -2
  112. package/dist/{impl-Cp5o0Q2g.mjs.map → impl-Do3hnGHt.mjs.map} +1 -1
  113. package/dist/{impl-VSo8bO-J.mjs → impl-DqbJ33ve.mjs} +2 -2
  114. package/dist/{impl-VSo8bO-J.mjs.map → impl-DqbJ33ve.mjs.map} +1 -1
  115. package/dist/{impl-Cb-7C1Ml2.mjs → impl-DvHiVaGW.mjs} +12 -105
  116. package/dist/impl-DvHiVaGW.mjs.map +1 -0
  117. package/dist/{impl-CTOgxZFi.mjs → impl-Dx8BYv7U.mjs} +2 -2
  118. package/dist/{impl-CTOgxZFi.mjs.map → impl-Dx8BYv7U.mjs.map} +1 -1
  119. package/dist/{impl-Bz1wZxa-.mjs → impl-GphhprmF.mjs} +2 -2
  120. package/dist/{impl-Bz1wZxa-.mjs.map → impl-GphhprmF.mjs.map} +1 -1
  121. package/dist/{impl-agm4lpyq.mjs → impl-HsRwcfRu.mjs} +2 -2
  122. package/dist/{impl-agm4lpyq.mjs.map → impl-HsRwcfRu.mjs.map} +1 -1
  123. package/dist/{impl-BHEAKFX02.mjs → impl-LT1FBKID2.mjs} +2 -2
  124. package/dist/{impl-BHEAKFX02.mjs.map → impl-LT1FBKID2.mjs.map} +1 -1
  125. package/dist/{impl-xY_5o78i.mjs → impl-Nwbb2xaH.mjs} +2 -2
  126. package/dist/{impl-xY_5o78i.mjs.map → impl-Nwbb2xaH.mjs.map} +1 -1
  127. package/dist/{impl-CSnBFv5P.mjs → impl-SKxxByoN.mjs} +2 -2
  128. package/dist/{impl-CSnBFv5P.mjs.map → impl-SKxxByoN.mjs.map} +1 -1
  129. package/dist/{impl-ojAnhhbi.mjs → impl-bUltX0u3.mjs} +2 -2
  130. package/dist/{impl-ojAnhhbi.mjs.map → impl-bUltX0u3.mjs.map} +1 -1
  131. package/dist/{impl-Bs2pNgMK.mjs → impl-cU3bjY3P.mjs} +2 -2
  132. package/dist/{impl-Bs2pNgMK.mjs.map → impl-cU3bjY3P.mjs.map} +1 -1
  133. package/dist/{impl-xVmMN-Vt.mjs → impl-h0z8OSQY.mjs} +2 -2
  134. package/dist/{impl-xVmMN-Vt.mjs.map → impl-h0z8OSQY.mjs.map} +1 -1
  135. package/dist/{impl-Ay6JeH-7.mjs → impl-kuuX5KaC.mjs} +2 -2
  136. package/dist/{impl-Ay6JeH-7.mjs.map → impl-kuuX5KaC.mjs.map} +1 -1
  137. package/dist/{impl-Ar7VAh0Z.mjs → impl-nYlbrsD7.mjs} +2 -2
  138. package/dist/{impl-Ar7VAh0Z.mjs.map → impl-nYlbrsD7.mjs.map} +1 -1
  139. package/dist/{impl-zZd6fuXS.mjs → impl-nte7qanu.mjs} +2 -2
  140. package/dist/{impl-zZd6fuXS.mjs.map → impl-nte7qanu.mjs.map} +1 -1
  141. package/dist/{impl-ApZGIx6l.mjs → impl-o66EB2o7.mjs} +2 -2
  142. package/dist/{impl-ApZGIx6l.mjs.map → impl-o66EB2o7.mjs.map} +1 -1
  143. package/dist/{impl-BpVe6fMe.mjs → impl-yxR3rwGm.mjs} +2 -2
  144. package/dist/{impl-BpVe6fMe.mjs.map → impl-yxR3rwGm.mjs.map} +1 -1
  145. package/dist/index.d.mts +36 -26
  146. package/dist/index.d.mts.map +1 -1
  147. package/dist/index.mjs +1 -1
  148. package/dist/{inquirer-jzIQWAvq.mjs → inquirer-DK1JbPA0.mjs} +2 -2
  149. package/dist/{inquirer-jzIQWAvq.mjs.map → inquirer-DK1JbPA0.mjs.map} +1 -1
  150. package/dist/{markRequestDataSiloIdsCompleted-JGJf33yp.mjs → markRequestDataSiloIdsCompleted-loC-xyyW.mjs} +2 -2
  151. package/dist/{markRequestDataSiloIdsCompleted-JGJf33yp.mjs.map → markRequestDataSiloIdsCompleted-loC-xyyW.mjs.map} +1 -1
  152. package/dist/{markSilentPrivacyRequests-BTI3rH-V.mjs → markSilentPrivacyRequests-D7ncAg8k.mjs} +2 -2
  153. package/dist/{markSilentPrivacyRequests-BTI3rH-V.mjs.map → markSilentPrivacyRequests-D7ncAg8k.mjs.map} +1 -1
  154. package/dist/{mergeTranscendInputs-B7WjxYMN.mjs → mergeTranscendInputs-9kQ3t5VY.mjs} +2 -2
  155. package/dist/{mergeTranscendInputs-B7WjxYMN.mjs.map → mergeTranscendInputs-9kQ3t5VY.mjs.map} +1 -1
  156. package/dist/{notifyPrivacyRequestsAdditionalTime-n5fvOJaA.mjs → notifyPrivacyRequestsAdditionalTime-DpCfIR_O.mjs} +2 -2
  157. package/dist/{notifyPrivacyRequestsAdditionalTime-n5fvOJaA.mjs.map → notifyPrivacyRequestsAdditionalTime-DpCfIR_O.mjs.map} +1 -1
  158. package/dist/{policy-bundle-manifest-DbbTXe0u.mjs → policy-bundle-manifest-DW3Wilp8.mjs} +2 -2
  159. package/dist/{policy-bundle-manifest-DbbTXe0u.mjs.map → policy-bundle-manifest-DW3Wilp8.mjs.map} +1 -1
  160. package/dist/{policy-project-discovery-DTSl0Gfl.mjs → policy-project-discovery-CND7N2HI.mjs} +4 -4
  161. package/dist/policy-project-discovery-CND7N2HI.mjs.map +1 -0
  162. package/dist/{policy-scaffold-config-RpxwwZ2H.mjs → policy-scaffold-config-CwY0QZC0.mjs} +8 -8
  163. package/dist/policy-scaffold-config-CwY0QZC0.mjs.map +1 -0
  164. package/dist/{project-discovery-BkHpTXDx.mjs → project-discovery-g29vd44a.mjs} +2 -2
  165. package/dist/{project-discovery-BkHpTXDx.mjs.map → project-discovery-g29vd44a.mjs.map} +1 -1
  166. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DbybCU2T.mjs → pullChunkedCustomSiloOutstandingIdentifiers-7qvaMN58.mjs} +2 -2
  167. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DbybCU2T.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-7qvaMN58.mjs.map} +1 -1
  168. package/dist/{pullManualEnrichmentIdentifiersToCsv-CxTPUfpV.mjs → pullManualEnrichmentIdentifiersToCsv-CWPs7VeX.mjs} +2 -2
  169. package/dist/{pullManualEnrichmentIdentifiersToCsv-CxTPUfpV.mjs.map → pullManualEnrichmentIdentifiersToCsv-CWPs7VeX.mjs.map} +1 -1
  170. package/dist/{pushCronIdentifiersFromCsv-CeRVlbFE.mjs → pushCronIdentifiersFromCsv-DQoliMdQ.mjs} +2 -2
  171. package/dist/{pushCronIdentifiersFromCsv-CeRVlbFE.mjs.map → pushCronIdentifiersFromCsv-DQoliMdQ.mjs.map} +1 -1
  172. package/dist/{pushManualEnrichmentIdentifiersFromCsv--4dYCvyv.mjs → pushManualEnrichmentIdentifiersFromCsv-R9BXYuFk.mjs} +2 -2
  173. package/dist/{pushManualEnrichmentIdentifiersFromCsv--4dYCvyv.mjs.map → pushManualEnrichmentIdentifiersFromCsv-R9BXYuFk.mjs.map} +1 -1
  174. package/dist/{readTranscendYaml-BfqQbPiT.mjs → readTranscendYaml-D576bvzR.mjs} +2 -2
  175. package/dist/{readTranscendYaml-BfqQbPiT.mjs.map → readTranscendYaml-D576bvzR.mjs.map} +1 -1
  176. package/dist/{removeUnverifiedRequestIdentifiers-CV6JGgt_.mjs → removeUnverifiedRequestIdentifiers-CgnfHdbc.mjs} +2 -2
  177. package/dist/{removeUnverifiedRequestIdentifiers-CV6JGgt_.mjs.map → removeUnverifiedRequestIdentifiers-CgnfHdbc.mjs.map} +1 -1
  178. package/dist/{retryRequestDataSilos-_OThvVwU.mjs → retryRequestDataSilos-BrLLNQqT.mjs} +2 -2
  179. package/dist/{retryRequestDataSilos-_OThvVwU.mjs.map → retryRequestDataSilos-BrLLNQqT.mjs.map} +1 -1
  180. package/dist/runRegalLintStep-DPaMm7Gg.mjs +3 -0
  181. package/dist/runRegalLintStep-DPaMm7Gg.mjs.map +1 -0
  182. package/dist/{scaffold-planning-BrX-pcz6.mjs → scaffold-planning-Bp_yqZWx.mjs} +2 -2
  183. package/dist/{scaffold-planning-BrX-pcz6.mjs.map → scaffold-planning-Bp_yqZWx.mjs.map} +1 -1
  184. package/dist/{skipPreflightJobs-D8og5pKe.mjs → skipPreflightJobs-CqjpB7ug.mjs} +2 -2
  185. package/dist/{skipPreflightJobs-D8og5pKe.mjs.map → skipPreflightJobs-CqjpB7ug.mjs.map} +1 -1
  186. package/dist/{skipRequestDataSilos-DUQ6AD_O.mjs → skipRequestDataSilos-DPi6-XVr.mjs} +2 -2
  187. package/dist/{skipRequestDataSilos-DUQ6AD_O.mjs.map → skipRequestDataSilos-DPi6-XVr.mjs.map} +1 -1
  188. package/dist/{streamPrivacyRequestsToCsv-BApu4dvI.mjs → streamPrivacyRequestsToCsv-DVPQ860_.mjs} +2 -2
  189. package/dist/{streamPrivacyRequestsToCsv-BApu4dvI.mjs.map → streamPrivacyRequestsToCsv-DVPQ860_.mjs.map} +1 -1
  190. package/dist/{updateConsentManagerVersionToLatest-BrgPZ5hX.mjs → updateConsentManagerVersionToLatest-gJMWny-i.mjs} +2 -2
  191. package/dist/{updateConsentManagerVersionToLatest-BrgPZ5hX.mjs.map → updateConsentManagerVersionToLatest-gJMWny-i.mjs.map} +1 -1
  192. package/dist/{uploadConsents-DRlDHQak.mjs → uploadConsents-5HlMj7EK.mjs} +2 -2
  193. package/dist/{uploadConsents-DRlDHQak.mjs.map → uploadConsents-5HlMj7EK.mjs.map} +1 -1
  194. package/dist/uploadPrivacyRequestsFromCsv-Dh8KEW3n.mjs +2 -0
  195. package/dist/uploadPrivacyRequestsFromCsv-Dh8KEW3n.mjs.map +1 -0
  196. package/dist/{validateTranscendAuth-D-dDINof.mjs → validateTranscendAuth-BrVGfq6X.mjs} +2 -2
  197. package/dist/{validateTranscendAuth-D-dDINof.mjs.map → validateTranscendAuth-BrVGfq6X.mjs.map} +1 -1
  198. package/package.json +22 -22
  199. package/dist/app-BMLQABJX.mjs.map +0 -1
  200. package/dist/codecs-CfcaFoZR.mjs +0 -2
  201. package/dist/codecs-CfcaFoZR.mjs.map +0 -1
  202. package/dist/constants-DlH2vWm_.mjs +0 -2
  203. package/dist/constants-DlH2vWm_.mjs.map +0 -1
  204. package/dist/fetchAllRequests-BI0tFl_a.mjs +0 -2
  205. package/dist/fetchAllRequests-BI0tFl_a.mjs.map +0 -1
  206. package/dist/impl-BEiCEzl_2.mjs.map +0 -1
  207. package/dist/impl-Cb-7C1Ml2.mjs.map +0 -1
  208. package/dist/impl-D6rMLiNB2.mjs.map +0 -1
  209. package/dist/impl-DNOgBcsu.mjs +0 -3
  210. package/dist/impl-DNOgBcsu.mjs.map +0 -1
  211. package/dist/impl-Dd39KsYO.mjs.map +0 -1
  212. package/dist/policy-project-discovery-DTSl0Gfl.mjs.map +0 -1
  213. package/dist/policy-scaffold-config-RpxwwZ2H.mjs.map +0 -1
  214. package/dist/uploadPrivacyRequestsFromCsv-FAGllBdd.mjs +0 -2
  215. package/dist/uploadPrivacyRequestsFromCsv-FAGllBdd.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"impl-CSnBFv5P.mjs","names":["retryRequestDataSilosHelper"],"sources":["../src/commands/request/system/retry-request-data-silos/impl.ts"],"sourcesContent":["import type { RequestAction } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../../context.js';\nimport { doneInputValidation } from '../../../../lib/cli/done-input-validation.js';\nimport { retryRequestDataSilos as retryRequestDataSilosHelper } from '../../../../lib/requests/index.js';\n\nexport interface RetryRequestDataSilosCommandFlags {\n auth: string;\n dataSiloId: string;\n actions: RequestAction[];\n transcendUrl: string;\n}\n\nexport async function retryRequestDataSilos(\n this: LocalContext,\n { auth, dataSiloId, actions, transcendUrl }: RetryRequestDataSilosCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await retryRequestDataSilosHelper({\n requestActions: actions,\n transcendUrl,\n auth,\n dataSiloId,\n });\n}\n"],"mappings":"6GAaA,eAAsB,EAEpB,CAAE,OAAM,aAAY,UAAS,gBACd,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAMA,EAA4B,CAChC,eAAgB,EAChB,eACA,OACA,aACD,CAAC"}
1
+ {"version":3,"file":"impl-SKxxByoN.mjs","names":["retryRequestDataSilosHelper"],"sources":["../src/commands/request/system/retry-request-data-silos/impl.ts"],"sourcesContent":["import type { RequestAction } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../../context.js';\nimport { doneInputValidation } from '../../../../lib/cli/done-input-validation.js';\nimport { retryRequestDataSilos as retryRequestDataSilosHelper } from '../../../../lib/requests/index.js';\n\nexport interface RetryRequestDataSilosCommandFlags {\n auth: string;\n dataSiloId: string;\n actions: RequestAction[];\n transcendUrl: string;\n}\n\nexport async function retryRequestDataSilos(\n this: LocalContext,\n { auth, dataSiloId, actions, transcendUrl }: RetryRequestDataSilosCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await retryRequestDataSilosHelper({\n requestActions: actions,\n transcendUrl,\n auth,\n dataSiloId,\n });\n}\n"],"mappings":"6GAaA,eAAsB,EAEpB,CAAE,OAAM,aAAY,UAAS,gBACd,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAMA,EAA4B,CAChC,eAAgB,EAChB,eACA,OACA,aACD,CAAC"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./downloadPrivacyRequestFiles-C9-xSCpt.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";import{RequestStatus as n}from"@transcend-io/privacy-types";async function r({auth:r,transcendUrl:i,folderPath:a,requestIds:o,statuses:s=[n.Approving,n.Downloadable],concurrency:c,createdAtBefore:l,createdAtAfter:u,updatedAtBefore:d,updatedAtAfter:f,approveAfterDownload:p}){t(this.process),await e({transcendUrl:i,auth:r,folderPath:a,requestIds:o,statuses:s,concurrency:c,createdAtBefore:l,createdAtAfter:u,updatedAtBefore:d,updatedAtAfter:f,approveAfterDownload:p})}export{r as downloadFiles};
2
- //# sourceMappingURL=impl-ojAnhhbi.mjs.map
1
+ import{t as e}from"./downloadPrivacyRequestFiles-DBeuW9b3.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";import{RequestStatus as n}from"@transcend-io/privacy-types";async function r({auth:r,transcendUrl:i,folderPath:a,requestIds:o,statuses:s=[n.Approving,n.Downloadable],concurrency:c,createdAtBefore:l,createdAtAfter:u,updatedAtBefore:d,updatedAtAfter:f,approveAfterDownload:p}){t(this.process),await e({transcendUrl:i,auth:r,folderPath:a,requestIds:o,statuses:s,concurrency:c,createdAtBefore:l,createdAtAfter:u,updatedAtBefore:d,updatedAtAfter:f,approveAfterDownload:p})}export{r as downloadFiles};
2
+ //# sourceMappingURL=impl-bUltX0u3.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-ojAnhhbi.mjs","names":[],"sources":["../src/commands/request/download-files/impl.ts"],"sourcesContent":["import { RequestStatus } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { downloadPrivacyRequestFiles } from '../../../lib/requests/index.js';\n\nexport interface DownloadFilesCommandFlags {\n auth: string;\n sombraAuth?: string;\n concurrency: number;\n requestIds?: string[];\n statuses?: RequestStatus[];\n folderPath: string;\n createdAtBefore?: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n approveAfterDownload: boolean;\n transcendUrl: string;\n}\n\nexport async function downloadFiles(\n this: LocalContext,\n {\n auth,\n transcendUrl,\n folderPath,\n requestIds,\n statuses = [RequestStatus.Approving, RequestStatus.Downloadable],\n concurrency,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n approveAfterDownload,\n }: DownloadFilesCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await downloadPrivacyRequestFiles({\n transcendUrl,\n auth,\n folderPath,\n requestIds,\n statuses,\n concurrency,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n approveAfterDownload,\n });\n}\n"],"mappings":"+KAqBA,eAAsB,EAEpB,CACE,OACA,eACA,aACA,aACA,WAAW,CAAC,EAAc,UAAW,EAAc,aAAa,CAChE,cACA,kBACA,iBACA,kBACA,iBACA,wBAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAM,EAA4B,CAChC,eACA,OACA,aACA,aACA,WACA,cACA,kBACA,iBACA,kBACA,iBACA,uBACD,CAAC"}
1
+ {"version":3,"file":"impl-bUltX0u3.mjs","names":[],"sources":["../src/commands/request/download-files/impl.ts"],"sourcesContent":["import { RequestStatus } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { downloadPrivacyRequestFiles } from '../../../lib/requests/index.js';\n\nexport interface DownloadFilesCommandFlags {\n auth: string;\n sombraAuth?: string;\n concurrency: number;\n requestIds?: string[];\n statuses?: RequestStatus[];\n folderPath: string;\n createdAtBefore?: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n approveAfterDownload: boolean;\n transcendUrl: string;\n}\n\nexport async function downloadFiles(\n this: LocalContext,\n {\n auth,\n transcendUrl,\n folderPath,\n requestIds,\n statuses = [RequestStatus.Approving, RequestStatus.Downloadable],\n concurrency,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n approveAfterDownload,\n }: DownloadFilesCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await downloadPrivacyRequestFiles({\n transcendUrl,\n auth,\n folderPath,\n requestIds,\n statuses,\n concurrency,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n approveAfterDownload,\n });\n}\n"],"mappings":"+KAqBA,eAAsB,EAEpB,CACE,OACA,eACA,aACA,aACA,WAAW,CAAC,EAAc,UAAW,EAAc,aAAa,CAChE,cACA,kBACA,iBACA,kBACA,iBACA,wBAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAM,EAA4B,CAChC,eACA,OACA,aACA,aACA,WACA,cACA,kBACA,iBACA,kBACA,iBACA,uBACD,CAAC"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./skipPreflightJobs-D8og5pKe.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";async function n({auth:n,transcendUrl:r,enricherIds:i}){t(this.process),await e({transcendUrl:r,auth:n,enricherIds:i})}export{n as skipPreflightJobs};
2
- //# sourceMappingURL=impl-Bs2pNgMK.mjs.map
1
+ import{t as e}from"./skipPreflightJobs-CqjpB7ug.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";async function n({auth:n,transcendUrl:r,enricherIds:i}){t(this.process),await e({transcendUrl:r,auth:n,enricherIds:i})}export{n as skipPreflightJobs};
2
+ //# sourceMappingURL=impl-cU3bjY3P.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-Bs2pNgMK.mjs","names":["skipPreflightJobsHelper"],"sources":["../src/commands/request/skip-preflight-jobs/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { skipPreflightJobs as skipPreflightJobsHelper } from '../../../lib/requests/index.js';\n\nexport interface SkipPreflightJobsCommandFlags {\n auth: string;\n enricherIds: string[];\n transcendUrl: string;\n}\n\nexport async function skipPreflightJobs(\n this: LocalContext,\n { auth, transcendUrl, enricherIds }: SkipPreflightJobsCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await skipPreflightJobsHelper({\n transcendUrl,\n auth,\n enricherIds,\n });\n}\n"],"mappings":"yGAUA,eAAsB,EAEpB,CAAE,OAAM,eAAc,eACP,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAMA,EAAwB,CAC5B,eACA,OACA,cACD,CAAC"}
1
+ {"version":3,"file":"impl-cU3bjY3P.mjs","names":["skipPreflightJobsHelper"],"sources":["../src/commands/request/skip-preflight-jobs/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { skipPreflightJobs as skipPreflightJobsHelper } from '../../../lib/requests/index.js';\n\nexport interface SkipPreflightJobsCommandFlags {\n auth: string;\n enricherIds: string[];\n transcendUrl: string;\n}\n\nexport async function skipPreflightJobs(\n this: LocalContext,\n { auth, transcendUrl, enricherIds }: SkipPreflightJobsCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await skipPreflightJobsHelper({\n transcendUrl,\n auth,\n enricherIds,\n });\n}\n"],"mappings":"yGAUA,eAAsB,EAEpB,CAAE,OAAM,eAAc,eACP,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAMA,EAAwB,CAC5B,eACA,OACA,cACD,CAAC"}
@@ -1,2 +1,2 @@
1
- import{g as e}from"./constants-FDjw7bPS.mjs";import{r as t,t as n}from"./project-plan-output-BHHlkLxe.mjs";import{t as r}from"./project-discovery-CWRjlFnC.mjs";import{t as i}from"./done-input-validation-LiTaCEzF.mjs";import{n as a}from"./project-discovery-BkHpTXDx.mjs";import{i as o,n as s,r as c,t as l}from"./prompts-BhXfYD6g.mjs";import{t as u}from"./run-captured-process-BjaSDWXG.mjs";import{r as d,t as f}from"./deno-runtime-CB2HBach.mjs";import{t as p}from"./scaffold-model-CUZER0BC.mjs";import{t as m}from"./project-plan-apply-Bg_1eMX9.mjs";import{c as h,i as g,n as _,s as v}from"./scaffold-planning-BrX-pcz6.mjs";import y from"colors";import{CUSTOM_FUNCTION_TYPES_VERSION as b}from"@transcend-io/custom-function-types";const x={[p.Deno]:`Deno configuration`,[p.Editor]:`VS Code settings`,[p.Skill]:`Agent skill`,[p.Ci]:`GitHub Actions`},S=Object.values(p);async function C(C,w){i(this.process);try{let i=a(this,{...w?{directory:w}:{},...C.manifest?{manifest:C.manifest}:{}}),l=new s(this),T=c(C,this.process.stdin.isTTY,this.process.stderr.isTTY),E=await o(l,{features:S,labels:x,enabled:{[p.Deno]:C.deno,[p.Editor]:C.editor,[p.Skill]:C.skill,[p.Ci]:C.ci},interactive:T}),D=_({state:i,snapshots:r(this,i.projectRoot,g(i,{features:E})),contractVersion:b,cliVersion:e},{features:E});if(E.includes(p.Deno)){let e=await u(`deno`,[`--version`],{cwd:this.process.cwd()},this);if(e.error?.code===`ENOENT`)D.warnings.push(`Deno 2.x is not installed. Install it from ${f}`);else if(e.code!==0)D.warnings.push(`Deno was found, but its version could not be determined. Deno 2.x is required. See ${f}`);else{let t=d(e.stdout);t.level!==`compatible`&&D.warnings.push(t.message)}}C.json||this.logger.info(t(D,{cwd:this.process.cwd(),title:`Custom Function plan`,details:[{label:`Target`,path:D.targetDirectory},{label:`Manifest`,path:D.manifestPath}]}));let O=D.changes.length===0||C.dryRun;if(D.changes.length>0&&!C.dryRun)if(C.yes)O=!0;else if(T)O=await l.confirm(`Apply this complete plan?`,!0);else throw Error(`The plan requires approval in a non-interactive invocation. Review with --dryRun, then pass --yes.`);O&&!C.dryRun&&D.changes.length>0&&await m(this,D);let k=O&&!C.dryRun&&D.changes.length>0,A=O&&!C.dryRun,j=h({targetDirectory:n(this.process.cwd(),i.targetDirectory),manifestPath:n(this.process.cwd(),i.manifestPath),cliVersion:e,hasSkill:A&&E.includes(p.Skill),hasGithubWorkflow:A&&E.includes(p.Ci)&&!!(i.repositoryRoot&&i.usesGithub)}),M=v(D,{applied:k,dryRun:C.dryRun,cwd:this.process.cwd(),aiHandoff:j});if(C.json){this.process.stdout.write(`${JSON.stringify(M)}\n`);return}if(C.dryRun){this.logger.info(y.yellow(`Dry run complete. No changes were written.`));return}if(!O){this.logger.info(y.yellow(`No changes applied.`));return}if(D.changes.length===0){this.logger.info(y.green(`Custom Function project is already initialized.`));return}this.logger.info(y.green(`Custom Function project initialized.`)),D.nextSteps.length>0&&(this.logger.info(`\n${y.bold(`Next steps`)}`),D.nextSteps.forEach(e=>this.logger.info(e))),this.logger.info(`\n${y.bold(`AI handoff — paste into your coding agent`)}`),this.logger.info(j)}catch(e){throw e instanceof l&&this.process.exit(130),e}}export{C as init};
2
- //# sourceMappingURL=impl-xVmMN-Vt.mjs.map
1
+ import{g as e}from"./constants-DAx9VK1C.mjs";import{r as t,t as n}from"./project-plan-output-BHHlkLxe.mjs";import{t as r}from"./project-discovery-CWRjlFnC.mjs";import{t as i}from"./done-input-validation-LiTaCEzF.mjs";import{n as a}from"./project-discovery-g29vd44a.mjs";import{i as o,n as s,r as c,t as l}from"./prompts-BhXfYD6g.mjs";import{t as u}from"./run-captured-process-BjaSDWXG.mjs";import{r as d,t as f}from"./deno-runtime-CB2HBach.mjs";import{t as p}from"./scaffold-model-CUZER0BC.mjs";import{t as m}from"./project-plan-apply-Bg_1eMX9.mjs";import{c as h,i as g,n as _,s as v}from"./scaffold-planning-Bp_yqZWx.mjs";import y from"colors";import{CUSTOM_FUNCTION_TYPES_VERSION as b}from"@transcend-io/custom-function-types";const x={[p.Deno]:`Deno configuration`,[p.Editor]:`VS Code settings`,[p.Skill]:`Agent skill`,[p.Ci]:`GitHub Actions`},S=Object.values(p);async function C(C,w){i(this.process);try{let i=a(this,{...w?{directory:w}:{},...C.manifest?{manifest:C.manifest}:{}}),l=new s(this),T=c(C,this.process.stdin.isTTY,this.process.stderr.isTTY),E=await o(l,{features:S,labels:x,enabled:{[p.Deno]:C.deno,[p.Editor]:C.editor,[p.Skill]:C.skill,[p.Ci]:C.ci},interactive:T}),D=_({state:i,snapshots:r(this,i.projectRoot,g(i,{features:E})),contractVersion:b,cliVersion:e},{features:E});if(E.includes(p.Deno)){let e=await u(`deno`,[`--version`],{cwd:this.process.cwd()},this);if(e.error?.code===`ENOENT`)D.warnings.push(`Deno 2.x is not installed. Install it from ${f}`);else if(e.code!==0)D.warnings.push(`Deno was found, but its version could not be determined. Deno 2.x is required. See ${f}`);else{let t=d(e.stdout);t.level!==`compatible`&&D.warnings.push(t.message)}}C.json||this.logger.info(t(D,{cwd:this.process.cwd(),title:`Custom Function plan`,details:[{label:`Target`,path:D.targetDirectory},{label:`Manifest`,path:D.manifestPath}]}));let O=D.changes.length===0||C.dryRun;if(D.changes.length>0&&!C.dryRun)if(C.yes)O=!0;else if(T)O=await l.confirm(`Apply this complete plan?`,!0);else throw Error(`The plan requires approval in a non-interactive invocation. Review with --dryRun, then pass --yes.`);O&&!C.dryRun&&D.changes.length>0&&await m(this,D);let k=O&&!C.dryRun&&D.changes.length>0,A=O&&!C.dryRun,j=h({targetDirectory:n(this.process.cwd(),i.targetDirectory),manifestPath:n(this.process.cwd(),i.manifestPath),cliVersion:e,hasSkill:A&&E.includes(p.Skill),hasGithubWorkflow:A&&E.includes(p.Ci)&&!!(i.repositoryRoot&&i.usesGithub)}),M=v(D,{applied:k,dryRun:C.dryRun,cwd:this.process.cwd(),aiHandoff:j});if(C.json){this.process.stdout.write(`${JSON.stringify(M)}\n`);return}if(C.dryRun){this.logger.info(y.yellow(`Dry run complete. No changes were written.`));return}if(!O){this.logger.info(y.yellow(`No changes applied.`));return}if(D.changes.length===0){this.logger.info(y.green(`Custom Function project is already initialized.`));return}this.logger.info(y.green(`Custom Function project initialized.`)),D.nextSteps.length>0&&(this.logger.info(`\n${y.bold(`Next steps`)}`),D.nextSteps.forEach(e=>this.logger.info(e))),this.logger.info(`\n${y.bold(`AI handoff — paste into your coding agent`)}`),this.logger.info(j)}catch(e){throw e instanceof l&&this.process.exit(130),e}}export{C as init};
2
+ //# sourceMappingURL=impl-h0z8OSQY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-xVmMN-Vt.mjs","names":["CLI_VERSION"],"sources":["../src/commands/custom-functions/init/impl.ts"],"sourcesContent":["import { CUSTOM_FUNCTION_TYPES_VERSION } from '@transcend-io/custom-function-types';\nimport colors from 'colors';\n\nimport { version as CLI_VERSION } from '../../../constants.js';\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { runCapturedProcess } from '../../../lib/cli/run-captured-process.js';\nimport { buildInitAiHandoff } from '../../../lib/custom-functions/ai-handoff.js';\nimport {\n DENO_INSTALL_URL,\n getDenoRuntimeCompatibility,\n SUPPORTED_DENO_MAJOR_VERSION,\n} from '../../../lib/custom-functions/deno-runtime.js';\nimport { discoverCustomFunctionProject } from '../../../lib/custom-functions/project-discovery.js';\nimport {\n CustomFunctionSetupFeature,\n type CustomFunctionSetupFeature as CustomFunctionSetupFeatureType,\n} from '../../../lib/custom-functions/scaffold-model.js';\nimport { buildPlanResult } from '../../../lib/custom-functions/scaffold-output.js';\nimport {\n buildInitPlan,\n getInitPlanningCandidatePaths,\n} from '../../../lib/custom-functions/scaffold-planning.js';\nimport { collectPlanningSnapshots } from '../../../lib/scaffolding/project-discovery.js';\nimport { applyProjectPlan } from '../../../lib/scaffolding/project-plan-apply.js';\nimport {\n displayProjectPath,\n renderProjectPlan,\n} from '../../../lib/scaffolding/project-plan-output.js';\nimport {\n isInteractivePromptInvocation,\n PromptCancelledError,\n resolveSetupFeatures,\n ScaffoldPrompts,\n} from '../../../lib/scaffolding/prompts.js';\n\n/** Flags for `custom-functions init`. */\nexport interface CustomFunctionInitFlags {\n /** Explicit manifest path. */\n manifest?: string;\n /** Install Deno configuration. */\n deno?: boolean;\n /** Install editor recommendations. */\n editor?: boolean;\n /** Install the coding-agent skill. */\n skill?: boolean;\n /** Install GitHub Actions validation. */\n ci?: boolean;\n /** Disable prompts. */\n noInteractive: boolean;\n /** Render but do not apply. */\n dryRun: boolean;\n /** Approve the final displayed plan. */\n yes: boolean;\n /** Emit one stable JSON result on stdout. */\n json: boolean;\n}\n\n/** User-facing setup labels. */\nconst SETUP_LABELS: Readonly<Record<CustomFunctionSetupFeatureType, string>> = {\n [CustomFunctionSetupFeature.Deno]: 'Deno configuration',\n [CustomFunctionSetupFeature.Editor]: 'VS Code settings',\n [CustomFunctionSetupFeature.Skill]: 'Agent skill',\n [CustomFunctionSetupFeature.Ci]: 'GitHub Actions',\n};\n\n/** All optional setup features in stable prompt order. */\nconst ALL_SETUP_FEATURES = Object.values(CustomFunctionSetupFeature);\n\n/**\n * Initialize a credential-free local Custom Function project.\n *\n * @param this - CLI context\n * @param flags - Scaffold and interaction flags\n * @param directory - Optional target directory\n */\nexport async function init(\n this: LocalContext,\n flags: CustomFunctionInitFlags,\n directory?: string,\n): Promise<void> {\n doneInputValidation(this.process);\n try {\n const state = discoverCustomFunctionProject(this, {\n ...(directory ? { directory } : {}),\n ...(flags.manifest ? { manifest: flags.manifest } : {}),\n });\n const prompts = new ScaffoldPrompts(this);\n const interactive = isInteractivePromptInvocation(\n flags,\n this.process.stdin.isTTY,\n this.process.stderr.isTTY,\n );\n const features = await resolveSetupFeatures(prompts, {\n features: ALL_SETUP_FEATURES,\n labels: SETUP_LABELS,\n enabled: {\n [CustomFunctionSetupFeature.Deno]: flags.deno,\n [CustomFunctionSetupFeature.Editor]: flags.editor,\n [CustomFunctionSetupFeature.Skill]: flags.skill,\n [CustomFunctionSetupFeature.Ci]: flags.ci,\n },\n interactive,\n });\n const snapshots = collectPlanningSnapshots(\n this,\n state.projectRoot,\n getInitPlanningCandidatePaths(state, { features }),\n );\n const plan = buildInitPlan(\n {\n state,\n snapshots,\n contractVersion: CUSTOM_FUNCTION_TYPES_VERSION,\n cliVersion: CLI_VERSION,\n },\n { features },\n );\n if (features.includes(CustomFunctionSetupFeature.Deno)) {\n const denoVersion = await runCapturedProcess(\n 'deno',\n ['--version'],\n { cwd: this.process.cwd() },\n this,\n );\n if (denoVersion.error?.code === 'ENOENT') {\n plan.warnings.push(\n `Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is not installed. Install it from ${DENO_INSTALL_URL}`,\n );\n } else if (denoVersion.code !== 0) {\n plan.warnings.push(\n `Deno was found, but its version could not be determined. Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is required. See ${DENO_INSTALL_URL}`,\n );\n } else {\n const compatibility = getDenoRuntimeCompatibility(denoVersion.stdout);\n if (compatibility.level !== 'compatible') {\n plan.warnings.push(compatibility.message);\n }\n }\n }\n if (!flags.json) {\n this.logger.info(\n renderProjectPlan(plan, {\n cwd: this.process.cwd(),\n title: 'Custom Function plan',\n details: [\n { label: 'Target', path: plan.targetDirectory },\n { label: 'Manifest', path: plan.manifestPath },\n ],\n }),\n );\n }\n\n let approved = plan.changes.length === 0 || flags.dryRun;\n if (plan.changes.length > 0 && !flags.dryRun) {\n if (flags.yes) {\n approved = true;\n } else if (interactive) {\n approved = await prompts.confirm('Apply this complete plan?', true);\n } else {\n throw new Error(\n 'The plan requires approval in a non-interactive invocation. Review with --dryRun, then pass --yes.',\n );\n }\n }\n\n if (approved && !flags.dryRun && plan.changes.length > 0) {\n await applyProjectPlan(this, plan);\n }\n const applied = approved && !flags.dryRun && plan.changes.length > 0;\n const setupAvailable = approved && !flags.dryRun;\n const aiHandoff = buildInitAiHandoff({\n targetDirectory: displayProjectPath(this.process.cwd(), state.targetDirectory),\n manifestPath: displayProjectPath(this.process.cwd(), state.manifestPath),\n cliVersion: CLI_VERSION,\n hasSkill: setupAvailable && features.includes(CustomFunctionSetupFeature.Skill),\n hasGithubWorkflow:\n setupAvailable &&\n features.includes(CustomFunctionSetupFeature.Ci) &&\n Boolean(state.repositoryRoot && state.usesGithub),\n });\n const result = buildPlanResult(plan, {\n applied,\n dryRun: flags.dryRun,\n cwd: this.process.cwd(),\n aiHandoff,\n });\n if (flags.json) {\n this.process.stdout.write(`${JSON.stringify(result)}\\n`);\n return;\n }\n if (flags.dryRun) {\n this.logger.info(colors.yellow('Dry run complete. No changes were written.'));\n return;\n }\n if (!approved) {\n this.logger.info(colors.yellow('No changes applied.'));\n return;\n }\n if (plan.changes.length === 0) {\n this.logger.info(colors.green('Custom Function project is already initialized.'));\n return;\n }\n this.logger.info(colors.green('Custom Function project initialized.'));\n if (plan.nextSteps.length > 0) {\n this.logger.info(`\\n${colors.bold('Next steps')}`);\n plan.nextSteps.forEach((step) => this.logger.info(step));\n }\n this.logger.info(`\\n${colors.bold('AI handoff — paste into your coding agent')}`);\n this.logger.info(aiHandoff);\n } catch (error) {\n if (error instanceof PromptCancelledError) {\n this.process.exit(130);\n }\n throw error;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"impl-h0z8OSQY.mjs","names":["CLI_VERSION"],"sources":["../src/commands/custom-functions/init/impl.ts"],"sourcesContent":["import { CUSTOM_FUNCTION_TYPES_VERSION } from '@transcend-io/custom-function-types';\nimport colors from 'colors';\n\nimport { version as CLI_VERSION } from '../../../constants.js';\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { runCapturedProcess } from '../../../lib/cli/run-captured-process.js';\nimport { buildInitAiHandoff } from '../../../lib/custom-functions/ai-handoff.js';\nimport {\n DENO_INSTALL_URL,\n getDenoRuntimeCompatibility,\n SUPPORTED_DENO_MAJOR_VERSION,\n} from '../../../lib/custom-functions/deno-runtime.js';\nimport { discoverCustomFunctionProject } from '../../../lib/custom-functions/project-discovery.js';\nimport {\n CustomFunctionSetupFeature,\n type CustomFunctionSetupFeature as CustomFunctionSetupFeatureType,\n} from '../../../lib/custom-functions/scaffold-model.js';\nimport { buildPlanResult } from '../../../lib/custom-functions/scaffold-output.js';\nimport {\n buildInitPlan,\n getInitPlanningCandidatePaths,\n} from '../../../lib/custom-functions/scaffold-planning.js';\nimport { collectPlanningSnapshots } from '../../../lib/scaffolding/project-discovery.js';\nimport { applyProjectPlan } from '../../../lib/scaffolding/project-plan-apply.js';\nimport {\n displayProjectPath,\n renderProjectPlan,\n} from '../../../lib/scaffolding/project-plan-output.js';\nimport {\n isInteractivePromptInvocation,\n PromptCancelledError,\n resolveSetupFeatures,\n ScaffoldPrompts,\n} from '../../../lib/scaffolding/prompts.js';\n\n/** Flags for `custom-functions init`. */\nexport interface CustomFunctionInitFlags {\n /** Explicit manifest path. */\n manifest?: string;\n /** Install Deno configuration. */\n deno?: boolean;\n /** Install editor recommendations. */\n editor?: boolean;\n /** Install the coding-agent skill. */\n skill?: boolean;\n /** Install GitHub Actions validation. */\n ci?: boolean;\n /** Disable prompts. */\n noInteractive: boolean;\n /** Render but do not apply. */\n dryRun: boolean;\n /** Approve the final displayed plan. */\n yes: boolean;\n /** Emit one stable JSON result on stdout. */\n json: boolean;\n}\n\n/** User-facing setup labels. */\nconst SETUP_LABELS: Readonly<Record<CustomFunctionSetupFeatureType, string>> = {\n [CustomFunctionSetupFeature.Deno]: 'Deno configuration',\n [CustomFunctionSetupFeature.Editor]: 'VS Code settings',\n [CustomFunctionSetupFeature.Skill]: 'Agent skill',\n [CustomFunctionSetupFeature.Ci]: 'GitHub Actions',\n};\n\n/** All optional setup features in stable prompt order. */\nconst ALL_SETUP_FEATURES = Object.values(CustomFunctionSetupFeature);\n\n/**\n * Initialize a credential-free local Custom Function project.\n *\n * @param this - CLI context\n * @param flags - Scaffold and interaction flags\n * @param directory - Optional target directory\n */\nexport async function init(\n this: LocalContext,\n flags: CustomFunctionInitFlags,\n directory?: string,\n): Promise<void> {\n doneInputValidation(this.process);\n try {\n const state = discoverCustomFunctionProject(this, {\n ...(directory ? { directory } : {}),\n ...(flags.manifest ? { manifest: flags.manifest } : {}),\n });\n const prompts = new ScaffoldPrompts(this);\n const interactive = isInteractivePromptInvocation(\n flags,\n this.process.stdin.isTTY,\n this.process.stderr.isTTY,\n );\n const features = await resolveSetupFeatures(prompts, {\n features: ALL_SETUP_FEATURES,\n labels: SETUP_LABELS,\n enabled: {\n [CustomFunctionSetupFeature.Deno]: flags.deno,\n [CustomFunctionSetupFeature.Editor]: flags.editor,\n [CustomFunctionSetupFeature.Skill]: flags.skill,\n [CustomFunctionSetupFeature.Ci]: flags.ci,\n },\n interactive,\n });\n const snapshots = collectPlanningSnapshots(\n this,\n state.projectRoot,\n getInitPlanningCandidatePaths(state, { features }),\n );\n const plan = buildInitPlan(\n {\n state,\n snapshots,\n contractVersion: CUSTOM_FUNCTION_TYPES_VERSION,\n cliVersion: CLI_VERSION,\n },\n { features },\n );\n if (features.includes(CustomFunctionSetupFeature.Deno)) {\n const denoVersion = await runCapturedProcess(\n 'deno',\n ['--version'],\n { cwd: this.process.cwd() },\n this,\n );\n if (denoVersion.error?.code === 'ENOENT') {\n plan.warnings.push(\n `Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is not installed. Install it from ${DENO_INSTALL_URL}`,\n );\n } else if (denoVersion.code !== 0) {\n plan.warnings.push(\n `Deno was found, but its version could not be determined. Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is required. See ${DENO_INSTALL_URL}`,\n );\n } else {\n const compatibility = getDenoRuntimeCompatibility(denoVersion.stdout);\n if (compatibility.level !== 'compatible') {\n plan.warnings.push(compatibility.message);\n }\n }\n }\n if (!flags.json) {\n this.logger.info(\n renderProjectPlan(plan, {\n cwd: this.process.cwd(),\n title: 'Custom Function plan',\n details: [\n { label: 'Target', path: plan.targetDirectory },\n { label: 'Manifest', path: plan.manifestPath },\n ],\n }),\n );\n }\n\n let approved = plan.changes.length === 0 || flags.dryRun;\n if (plan.changes.length > 0 && !flags.dryRun) {\n if (flags.yes) {\n approved = true;\n } else if (interactive) {\n approved = await prompts.confirm('Apply this complete plan?', true);\n } else {\n throw new Error(\n 'The plan requires approval in a non-interactive invocation. Review with --dryRun, then pass --yes.',\n );\n }\n }\n\n if (approved && !flags.dryRun && plan.changes.length > 0) {\n await applyProjectPlan(this, plan);\n }\n const applied = approved && !flags.dryRun && plan.changes.length > 0;\n const setupAvailable = approved && !flags.dryRun;\n const aiHandoff = buildInitAiHandoff({\n targetDirectory: displayProjectPath(this.process.cwd(), state.targetDirectory),\n manifestPath: displayProjectPath(this.process.cwd(), state.manifestPath),\n cliVersion: CLI_VERSION,\n hasSkill: setupAvailable && features.includes(CustomFunctionSetupFeature.Skill),\n hasGithubWorkflow:\n setupAvailable &&\n features.includes(CustomFunctionSetupFeature.Ci) &&\n Boolean(state.repositoryRoot && state.usesGithub),\n });\n const result = buildPlanResult(plan, {\n applied,\n dryRun: flags.dryRun,\n cwd: this.process.cwd(),\n aiHandoff,\n });\n if (flags.json) {\n this.process.stdout.write(`${JSON.stringify(result)}\\n`);\n return;\n }\n if (flags.dryRun) {\n this.logger.info(colors.yellow('Dry run complete. No changes were written.'));\n return;\n }\n if (!approved) {\n this.logger.info(colors.yellow('No changes applied.'));\n return;\n }\n if (plan.changes.length === 0) {\n this.logger.info(colors.green('Custom Function project is already initialized.'));\n return;\n }\n this.logger.info(colors.green('Custom Function project initialized.'));\n if (plan.nextSteps.length > 0) {\n this.logger.info(`\\n${colors.bold('Next steps')}`);\n plan.nextSteps.forEach((step) => this.logger.info(step));\n }\n this.logger.info(`\\n${colors.bold('AI handoff — paste into your coding agent')}`);\n this.logger.info(aiHandoff);\n } catch (error) {\n if (error instanceof PromptCancelledError) {\n this.process.exit(130);\n }\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{N as e}from"./codecs-CfcaFoZR.mjs";import{t}from"./readCsv-DNcJ_UfU.mjs";import{n}from"./mapConsentCsvRowsToInputs-CkLfxaIf.mjs";import{t as r}from"./done-input-validation-LiTaCEzF.mjs";import i from"colors";import{buildTranscendGraphQLClient as a,syncDataFlows as o}from"@transcend-io/sdk";async function s({auth:s,trackerStatus:c,file:l,classifyService:u,transcendUrl:d}){r(this.process),this.logger.info(i.magenta(`Reading "${l}" from disk`));let f=n(t(this.fs.readFileSync(l,`utf8`),e),c);await o(a(d,s),f,{classifyService:u,logger:this.logger})||(this.logger.error(i.red(`Encountered error(s) syncing data flows from CSV, see logs above for more info. `)),this.process.exit(1))}export{s as uploadDataFlowsFromCsv};
2
- //# sourceMappingURL=impl-Ay6JeH-7.mjs.map
1
+ import{N as e}from"./codecs-8T8Jhxsr.mjs";import{t}from"./readCsv-DNcJ_UfU.mjs";import{n}from"./mapConsentCsvRowsToInputs-CkLfxaIf.mjs";import{t as r}from"./done-input-validation-LiTaCEzF.mjs";import i from"colors";import{buildTranscendGraphQLClient as a,syncDataFlows as o}from"@transcend-io/sdk";async function s({auth:s,trackerStatus:c,file:l,classifyService:u,transcendUrl:d}){r(this.process),this.logger.info(i.magenta(`Reading "${l}" from disk`));let f=n(t(this.fs.readFileSync(l,`utf8`),e),c);await o(a(d,s),f,{classifyService:u,logger:this.logger})||(this.logger.error(i.red(`Encountered error(s) syncing data flows from CSV, see logs above for more info. `)),this.process.exit(1))}export{s as uploadDataFlowsFromCsv};
2
+ //# sourceMappingURL=impl-kuuX5KaC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-Ay6JeH-7.mjs","names":[],"sources":["../src/commands/consent/upload-data-flows-from-csv/impl.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, syncDataFlows } from '@transcend-io/sdk';\nimport colors from 'colors';\n\nimport { DataFlowCsvInput } from '../../../codecs.js';\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { mapDataFlowCsvRowsToInputs } from '../../../lib/consent-manager/mapConsentCsvRowsToInputs.js';\nimport { parseCsv } from '../../../lib/requests/readCsv.js';\n\nexport interface UploadDataFlowsFromCsvCommandFlags {\n auth: string;\n trackerStatus: ConsentTrackerStatus;\n file: string;\n classifyService: boolean;\n transcendUrl: string;\n}\n\nexport async function uploadDataFlowsFromCsv(\n this: LocalContext,\n { auth, trackerStatus, file, classifyService, transcendUrl }: UploadDataFlowsFromCsvCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n this.logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const dataFlowRows = parseCsv(this.fs.readFileSync(file, 'utf8'), DataFlowCsvInput);\n const dataFlowInputs = mapDataFlowCsvRowsToInputs(dataFlowRows, trackerStatus);\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const syncedDataFlows = await syncDataFlows(client, dataFlowInputs, {\n classifyService,\n logger: this.logger,\n });\n\n if (!syncedDataFlows) {\n this.logger.error(\n colors.red(\n 'Encountered error(s) syncing data flows from CSV, see logs above for more info. ',\n ),\n );\n this.process.exit(1);\n }\n}\n"],"mappings":"0SAkBA,eAAsB,EAEpB,CAAE,OAAM,gBAAe,OAAM,kBAAiB,gBAC/B,CACf,EAAoB,KAAK,QAAQ,CAEjC,KAAK,OAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAE/D,IAAM,EAAiB,EADF,EAAS,KAAK,GAAG,aAAa,EAAM,OAAO,CAAE,EACJ,CAAE,EAAc,CAOzE,MALyB,EADf,EAA4B,EAAc,EACP,CAAE,EAAgB,CAClE,kBACA,OAAQ,KAAK,OACd,CAAC,GAGA,KAAK,OAAO,MACV,EAAO,IACL,mFACD,CACF,CACD,KAAK,QAAQ,KAAK,EAAE"}
1
+ {"version":3,"file":"impl-kuuX5KaC.mjs","names":[],"sources":["../src/commands/consent/upload-data-flows-from-csv/impl.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, syncDataFlows } from '@transcend-io/sdk';\nimport colors from 'colors';\n\nimport { DataFlowCsvInput } from '../../../codecs.js';\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { mapDataFlowCsvRowsToInputs } from '../../../lib/consent-manager/mapConsentCsvRowsToInputs.js';\nimport { parseCsv } from '../../../lib/requests/readCsv.js';\n\nexport interface UploadDataFlowsFromCsvCommandFlags {\n auth: string;\n trackerStatus: ConsentTrackerStatus;\n file: string;\n classifyService: boolean;\n transcendUrl: string;\n}\n\nexport async function uploadDataFlowsFromCsv(\n this: LocalContext,\n { auth, trackerStatus, file, classifyService, transcendUrl }: UploadDataFlowsFromCsvCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n this.logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const dataFlowRows = parseCsv(this.fs.readFileSync(file, 'utf8'), DataFlowCsvInput);\n const dataFlowInputs = mapDataFlowCsvRowsToInputs(dataFlowRows, trackerStatus);\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const syncedDataFlows = await syncDataFlows(client, dataFlowInputs, {\n classifyService,\n logger: this.logger,\n });\n\n if (!syncedDataFlows) {\n this.logger.error(\n colors.red(\n 'Encountered error(s) syncing data flows from CSV, see logs above for more info. ',\n ),\n );\n this.process.exit(1);\n }\n}\n"],"mappings":"0SAkBA,eAAsB,EAEpB,CAAE,OAAM,gBAAe,OAAM,kBAAiB,gBAC/B,CACf,EAAoB,KAAK,QAAQ,CAEjC,KAAK,OAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAE/D,IAAM,EAAiB,EADF,EAAS,KAAK,GAAG,aAAa,EAAM,OAAO,CAAE,EACJ,CAAE,EAAc,CAOzE,MALyB,EADf,EAA4B,EAAc,EACP,CAAE,EAAgB,CAClE,kBACA,OAAQ,KAAK,OACd,CAAC,GAGA,KAAK,OAAO,MACV,EAAO,IACL,mFACD,CACF,CACD,KAAK,QAAQ,KAAK,EAAE"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./skipRequestDataSilos-DUQ6AD_O.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";async function n({auth:n,dataSiloId:r,status:i,statuses:a,transcendUrl:o,actionTypes:s}){t(this.process),await e({transcendUrl:o,auth:n,status:i,dataSiloId:r,requestStatuses:a,actionTypes:s})}export{n as skipRequestDataSilos};
2
- //# sourceMappingURL=impl-Ar7VAh0Z.mjs.map
1
+ import{t as e}from"./skipRequestDataSilos-DPi6-XVr.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";async function n({auth:n,dataSiloId:r,status:i,statuses:a,transcendUrl:o,actionTypes:s}){t(this.process),await e({transcendUrl:o,auth:n,status:i,dataSiloId:r,requestStatuses:a,actionTypes:s})}export{n as skipRequestDataSilos};
2
+ //# sourceMappingURL=impl-nYlbrsD7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-Ar7VAh0Z.mjs","names":["skipRequestDataSilosHelper"],"sources":["../src/commands/request/system/skip-request-data-silos/impl.ts"],"sourcesContent":["import type {\n RequestAction,\n RequestDataSiloStatus,\n RequestStatus,\n} from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../../context.js';\nimport { doneInputValidation } from '../../../../lib/cli/done-input-validation.js';\nimport { skipRequestDataSilos as skipRequestDataSilosHelper } from '../../../../lib/requests/index.js';\n\nexport interface SkipRequestDataSilosCommandFlags {\n auth: string;\n dataSiloId: string;\n transcendUrl: string;\n statuses: RequestStatus[];\n status: (typeof RequestDataSiloStatus)['Skipped'] | (typeof RequestDataSiloStatus)['Resolved'];\n actionTypes?: RequestAction[];\n}\n\nexport async function skipRequestDataSilos(\n this: LocalContext,\n {\n auth,\n dataSiloId,\n status,\n statuses,\n transcendUrl,\n actionTypes,\n }: SkipRequestDataSilosCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await skipRequestDataSilosHelper({\n transcendUrl,\n auth,\n status,\n dataSiloId,\n requestStatuses: statuses,\n actionTypes,\n });\n}\n"],"mappings":"4GAmBA,eAAsB,EAEpB,CACE,OACA,aACA,SACA,WACA,eACA,eAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAMA,EAA2B,CAC/B,eACA,OACA,SACA,aACA,gBAAiB,EACjB,cACD,CAAC"}
1
+ {"version":3,"file":"impl-nYlbrsD7.mjs","names":["skipRequestDataSilosHelper"],"sources":["../src/commands/request/system/skip-request-data-silos/impl.ts"],"sourcesContent":["import type {\n RequestAction,\n RequestDataSiloStatus,\n RequestStatus,\n} from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../../context.js';\nimport { doneInputValidation } from '../../../../lib/cli/done-input-validation.js';\nimport { skipRequestDataSilos as skipRequestDataSilosHelper } from '../../../../lib/requests/index.js';\n\nexport interface SkipRequestDataSilosCommandFlags {\n auth: string;\n dataSiloId: string;\n transcendUrl: string;\n statuses: RequestStatus[];\n status: (typeof RequestDataSiloStatus)['Skipped'] | (typeof RequestDataSiloStatus)['Resolved'];\n actionTypes?: RequestAction[];\n}\n\nexport async function skipRequestDataSilos(\n this: LocalContext,\n {\n auth,\n dataSiloId,\n status,\n statuses,\n transcendUrl,\n actionTypes,\n }: SkipRequestDataSilosCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await skipRequestDataSilosHelper({\n transcendUrl,\n auth,\n status,\n dataSiloId,\n requestStatuses: statuses,\n actionTypes,\n });\n}\n"],"mappings":"4GAmBA,eAAsB,EAEpB,CACE,OACA,aACA,SACA,WACA,eACA,eAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAMA,EAA2B,CAC/B,eACA,OACA,SACA,aACA,gBAAiB,EACjB,cACD,CAAC"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./cancelPrivacyRequests-Ccsiwrnu.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";async function n({auth:n,actions:r,statuses:i=[],requestIds:a,silentModeBefore:o,createdAtBefore:s,createdAtAfter:c,updatedAtBefore:l,updatedAtAfter:u,cancellationTitle:d,transcendUrl:f,concurrency:p}){t(this.process),await e({transcendUrl:f,requestActions:r,auth:n,cancellationTitle:d,requestIds:a,statuses:i,concurrency:p,silentModeBefore:o?new Date(o):void 0,createdAtBefore:s?new Date(s):void 0,createdAtAfter:c?new Date(c):void 0,updatedAtBefore:l?new Date(l):void 0,updatedAtAfter:u?new Date(u):void 0})}export{n as cancel};
2
- //# sourceMappingURL=impl-zZd6fuXS.mjs.map
1
+ import{t as e}from"./cancelPrivacyRequests-Cy48R4tJ.mjs";import{t}from"./done-input-validation-LiTaCEzF.mjs";async function n({auth:n,actions:r,statuses:i=[],requestIds:a,silentModeBefore:o,createdAtBefore:s,createdAtAfter:c,updatedAtBefore:l,updatedAtAfter:u,cancellationTitle:d,transcendUrl:f,concurrency:p}){t(this.process),await e({transcendUrl:f,requestActions:r,auth:n,cancellationTitle:d,requestIds:a,statuses:i,concurrency:p,silentModeBefore:o?new Date(o):void 0,createdAtBefore:s?new Date(s):void 0,createdAtAfter:c?new Date(c):void 0,updatedAtBefore:l?new Date(l):void 0,updatedAtAfter:u?new Date(u):void 0})}export{n as cancel};
2
+ //# sourceMappingURL=impl-nte7qanu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-zZd6fuXS.mjs","names":[],"sources":["../src/commands/request/cancel/impl.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { cancelPrivacyRequests } from '../../../lib/requests/index.js';\n\nexport interface CancelCommandFlags {\n auth: string;\n actions: RequestAction[];\n statuses?: RequestStatus[];\n requestIds?: string[];\n silentModeBefore?: Date;\n createdAtBefore?: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n cancellationTitle: string;\n transcendUrl: string;\n concurrency: number;\n}\n\nexport async function cancel(\n this: LocalContext,\n {\n auth,\n actions,\n statuses = [],\n requestIds,\n silentModeBefore,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n cancellationTitle,\n transcendUrl,\n concurrency,\n }: CancelCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await cancelPrivacyRequests({\n transcendUrl,\n requestActions: actions,\n auth,\n cancellationTitle,\n requestIds,\n statuses,\n concurrency,\n silentModeBefore: silentModeBefore ? new Date(silentModeBefore) : undefined,\n createdAtBefore: createdAtBefore ? new Date(createdAtBefore) : undefined,\n createdAtAfter: createdAtAfter ? new Date(createdAtAfter) : undefined,\n updatedAtBefore: updatedAtBefore ? new Date(updatedAtBefore) : undefined,\n updatedAtAfter: updatedAtAfter ? new Date(updatedAtAfter) : undefined,\n });\n}\n"],"mappings":"6GAqBA,eAAsB,EAEpB,CACE,OACA,UACA,WAAW,EAAE,CACb,aACA,mBACA,kBACA,iBACA,kBACA,iBACA,oBACA,eACA,eAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAM,EAAsB,CAC1B,eACA,eAAgB,EAChB,OACA,oBACA,aACA,WACA,cACA,iBAAkB,EAAmB,IAAI,KAAK,EAAiB,CAAG,IAAA,GAClE,gBAAiB,EAAkB,IAAI,KAAK,EAAgB,CAAG,IAAA,GAC/D,eAAgB,EAAiB,IAAI,KAAK,EAAe,CAAG,IAAA,GAC5D,gBAAiB,EAAkB,IAAI,KAAK,EAAgB,CAAG,IAAA,GAC/D,eAAgB,EAAiB,IAAI,KAAK,EAAe,CAAG,IAAA,GAC7D,CAAC"}
1
+ {"version":3,"file":"impl-nte7qanu.mjs","names":[],"sources":["../src/commands/request/cancel/impl.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { cancelPrivacyRequests } from '../../../lib/requests/index.js';\n\nexport interface CancelCommandFlags {\n auth: string;\n actions: RequestAction[];\n statuses?: RequestStatus[];\n requestIds?: string[];\n silentModeBefore?: Date;\n createdAtBefore?: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n cancellationTitle: string;\n transcendUrl: string;\n concurrency: number;\n}\n\nexport async function cancel(\n this: LocalContext,\n {\n auth,\n actions,\n statuses = [],\n requestIds,\n silentModeBefore,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n cancellationTitle,\n transcendUrl,\n concurrency,\n }: CancelCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await cancelPrivacyRequests({\n transcendUrl,\n requestActions: actions,\n auth,\n cancellationTitle,\n requestIds,\n statuses,\n concurrency,\n silentModeBefore: silentModeBefore ? new Date(silentModeBefore) : undefined,\n createdAtBefore: createdAtBefore ? new Date(createdAtBefore) : undefined,\n createdAtAfter: createdAtAfter ? new Date(createdAtAfter) : undefined,\n updatedAtBefore: updatedAtBefore ? new Date(updatedAtBefore) : undefined,\n updatedAtAfter: updatedAtAfter ? new Date(updatedAtAfter) : undefined,\n });\n}\n"],"mappings":"6GAqBA,eAAsB,EAEpB,CACE,OACA,UACA,WAAW,EAAE,CACb,aACA,mBACA,kBACA,iBACA,kBACA,iBACA,oBACA,eACA,eAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAM,EAAsB,CAC1B,eACA,eAAgB,EAChB,OACA,oBACA,aACA,WACA,cACA,iBAAkB,EAAmB,IAAI,KAAK,EAAiB,CAAG,IAAA,GAClE,gBAAiB,EAAkB,IAAI,KAAK,EAAgB,CAAG,IAAA,GAC/D,eAAgB,EAAiB,IAAI,KAAK,EAAe,CAAG,IAAA,GAC5D,gBAAiB,EAAkB,IAAI,KAAK,EAAgB,CAAG,IAAA,GAC/D,eAAgB,EAAiB,IAAI,KAAK,EAAe,CAAG,IAAA,GAC7D,CAAC"}
@@ -1,2 +1,2 @@
1
- import{D as e}from"./codecs-CfcaFoZR.mjs";import{t}from"./readCsv-DNcJ_UfU.mjs";import{t as n}from"./mapConsentCsvRowsToInputs-CkLfxaIf.mjs";import{t as r}from"./done-input-validation-LiTaCEzF.mjs";import i from"colors";import{buildTranscendGraphQLClient as a,syncCookies as o}from"@transcend-io/sdk";async function s({auth:s,trackerStatus:c,file:l,transcendUrl:u}){r(this.process),this.logger.info(i.magenta(`Reading "${l}" from disk`));let d=n(t(this.fs.readFileSync(l,`utf8`),e),c);await o(a(u,s),d,{logger:this.logger})||(this.logger.error(i.red(`Encountered error(s) syncing cookies from CSV, see logs above for more info. `)),this.process.exit(1))}export{s as uploadCookiesFromCsv};
2
- //# sourceMappingURL=impl-ApZGIx6l.mjs.map
1
+ import{D as e}from"./codecs-8T8Jhxsr.mjs";import{t}from"./readCsv-DNcJ_UfU.mjs";import{t as n}from"./mapConsentCsvRowsToInputs-CkLfxaIf.mjs";import{t as r}from"./done-input-validation-LiTaCEzF.mjs";import i from"colors";import{buildTranscendGraphQLClient as a,syncCookies as o}from"@transcend-io/sdk";async function s({auth:s,trackerStatus:c,file:l,transcendUrl:u}){r(this.process),this.logger.info(i.magenta(`Reading "${l}" from disk`));let d=n(t(this.fs.readFileSync(l,`utf8`),e),c);await o(a(u,s),d,{logger:this.logger})||(this.logger.error(i.red(`Encountered error(s) syncing cookies from CSV, see logs above for more info. `)),this.process.exit(1))}export{s as uploadCookiesFromCsv};
2
+ //# sourceMappingURL=impl-o66EB2o7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-ApZGIx6l.mjs","names":[],"sources":["../src/commands/consent/upload-cookies-from-csv/impl.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, syncCookies } from '@transcend-io/sdk';\nimport colors from 'colors';\n\nimport { CookieCsvInput } from '../../../codecs.js';\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { mapCookieCsvRowsToInputs } from '../../../lib/consent-manager/mapConsentCsvRowsToInputs.js';\nimport { parseCsv } from '../../../lib/requests/readCsv.js';\n\nexport interface UploadCookiesFromCsvCommandFlags {\n auth: string;\n trackerStatus: ConsentTrackerStatus;\n file: string;\n transcendUrl: string;\n}\n\nexport async function uploadCookiesFromCsv(\n this: LocalContext,\n { auth, trackerStatus, file, transcendUrl }: UploadCookiesFromCsvCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n this.logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const cookieRows = parseCsv(this.fs.readFileSync(file, 'utf8'), CookieCsvInput);\n const cookieInputs = mapCookieCsvRowsToInputs(cookieRows, trackerStatus);\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const syncedCookies = await syncCookies(client, cookieInputs, { logger: this.logger });\n\n if (!syncedCookies) {\n this.logger.error(\n colors.red('Encountered error(s) syncing cookies from CSV, see logs above for more info. '),\n );\n this.process.exit(1);\n }\n}\n"],"mappings":"6SAiBA,eAAsB,EAEpB,CAAE,OAAM,gBAAe,OAAM,gBACd,CACf,EAAoB,KAAK,QAAQ,CAEjC,KAAK,OAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAE/D,IAAM,EAAe,EADF,EAAS,KAAK,GAAG,aAAa,EAAM,OAAO,CAAE,EACR,CAAE,EAAc,CAInE,MAFuB,EADb,EAA4B,EAAc,EACX,CAAE,EAAc,CAAE,OAAQ,KAAK,OAAQ,CAAC,GAGpF,KAAK,OAAO,MACV,EAAO,IAAI,gFAAgF,CAC5F,CACD,KAAK,QAAQ,KAAK,EAAE"}
1
+ {"version":3,"file":"impl-o66EB2o7.mjs","names":[],"sources":["../src/commands/consent/upload-cookies-from-csv/impl.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, syncCookies } from '@transcend-io/sdk';\nimport colors from 'colors';\n\nimport { CookieCsvInput } from '../../../codecs.js';\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { mapCookieCsvRowsToInputs } from '../../../lib/consent-manager/mapConsentCsvRowsToInputs.js';\nimport { parseCsv } from '../../../lib/requests/readCsv.js';\n\nexport interface UploadCookiesFromCsvCommandFlags {\n auth: string;\n trackerStatus: ConsentTrackerStatus;\n file: string;\n transcendUrl: string;\n}\n\nexport async function uploadCookiesFromCsv(\n this: LocalContext,\n { auth, trackerStatus, file, transcendUrl }: UploadCookiesFromCsvCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n this.logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const cookieRows = parseCsv(this.fs.readFileSync(file, 'utf8'), CookieCsvInput);\n const cookieInputs = mapCookieCsvRowsToInputs(cookieRows, trackerStatus);\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const syncedCookies = await syncCookies(client, cookieInputs, { logger: this.logger });\n\n if (!syncedCookies) {\n this.logger.error(\n colors.red('Encountered error(s) syncing cookies from CSV, see logs above for more info. '),\n );\n this.process.exit(1);\n }\n}\n"],"mappings":"6SAiBA,eAAsB,EAEpB,CAAE,OAAM,gBAAe,OAAM,gBACd,CACf,EAAoB,KAAK,QAAQ,CAEjC,KAAK,OAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAE/D,IAAM,EAAe,EADF,EAAS,KAAK,GAAG,aAAa,EAAM,OAAO,CAAE,EACR,CAAE,EAAc,CAInE,MAFuB,EADb,EAA4B,EAAc,EACX,CAAE,EAAc,CAAE,OAAQ,KAAK,OAAQ,CAAC,GAGpF,KAAK,OAAO,MACV,EAAO,IAAI,gFAAgF,CAC5F,CACD,KAAK,QAAQ,KAAK,EAAE"}
@@ -1,3 +1,3 @@
1
- import{i as e}from"./paths-J5KScOaQ.mjs";import{o as t,s as n}from"./project-discovery-CWRjlFnC.mjs";import{a as r}from"./readTranscendYaml-BfqQbPiT.mjs";import{t as i}from"./parseVariablesFromString-6TYW65LF.mjs";import{t as a}from"./done-input-validation-LiTaCEzF.mjs";import{t as o}from"./missing-manifest-D8y1VL4p.mjs";import{a as s,i as c,l,t as u}from"./project-discovery-BkHpTXDx.mjs";import{n as d,r as f,t as p}from"./prompts-BhXfYD6g.mjs";import{t as m}from"./run-captured-process-BjaSDWXG.mjs";import{r as h,t as g}from"./deno-runtime-CB2HBach.mjs";import{t as _}from"./module-graph-CAT8_JCG.mjs";import{t as v}from"./project-plan-apply-Bg_1eMX9.mjs";import{dirname as y,extname as b,join as x,relative as S,resolve as C,sep as w}from"node:path";import T from"colors";import{createTwoFilesPatch as E}from"diff";import{DSR_DATAPOINT_CUSTOM_FUNCTION_PAYLOAD_SCHEMA as D,DSR_REQUEST_ENRICHER_CUSTOM_FUNCTION_PAYLOAD_SCHEMA as O,GENERAL_CUSTOM_FUNCTION_PAYLOAD_SCHEMA as k}from"@transcend-io/custom-function-types";import A from"ajv";import{parse as j}from"jsonc-parser";function M(e,t){e.push({severity:`error`,...t})}function N(e,t){return S(e,t).split(w).join(`/`)||`.`}function P(e){let t=t=>e.type===`DSR`?t===`REQUEST_ENRICHER`?`dsr-enricher`:`dsr-datapoint`:`general`;return e[`test-payload`]?[{entry:e,path:e[`test-payload`],type:t(e[`test-payload-type`])}]:(e[`test-payloads`]??[]).map(n=>({entry:e,path:n.payload,type:t(n[`payload-type`])}))}function F(e,t){let n=P(e).map(({type:e})=>e),r=e.type===`DSR`&&n.length===0;return{entry:e,path:C(t,e.code),needsDefault:e.type!==`DSR`||n.includes(`dsr-datapoint`),needsEnricher:n.includes(`dsr-enricher`),needsAnyDsrExport:r}}function I(){let e=new A({allErrors:!0,strict:!1});return{general:e.compile(k),"dsr-datapoint":e.compile(D),"dsr-enricher":e.compile(O)}}function L(e){return`${e.instancePath||`/`} ${e.message??`is invalid`}`}function R(e,t,r,i){let a=I(),o=[],s=[];return r.forEach(r=>{if(/<<parameters\.[^>]+>>/u.test(r.code))M(i,{code:`manifest.unresolved-code-path`,message:`Code paths cannot contain unresolved parameter placeholders.`,path:r.code,functionName:r.name});else if(c(r.code)){let a=F(r,t);e.fs.existsSync(a.path)?n(e,t,a.path)?e.fs.statSync(a.path).isFile()?o.push(a):M(i,{code:`source.not-file`,message:`Referenced source path is not a regular file.`,path:r.code,functionName:r.name}):M(i,{code:`source.outside-project`,message:`Referenced source resolves outside the manifest directory through a symlink.`,path:r.code,functionName:r.name}):M(i,{code:`source.missing`,message:`Referenced source file does not exist.`,path:r.code,functionName:r.name})}P(r).forEach(o=>{if(/<<parameters\.[^>]+>>/u.test(o.path)){M(i,{code:`manifest.unresolved-payload-path`,message:`Payload paths cannot contain unresolved parameter placeholders.`,path:o.path,functionName:r.name});return}let c=C(t,o.path);if(!e.fs.existsSync(c)){M(i,{code:`payload.missing`,message:`Referenced test payload does not exist.`,path:o.path,functionName:r.name});return}if(!n(e,t,c)){M(i,{code:`payload.outside-project`,message:`Referenced test payload resolves outside the manifest directory through a symlink.`,path:o.path,functionName:r.name});return}if(!e.fs.statSync(c).isFile()){M(i,{code:`payload.not-file`,message:`Referenced test payload is not a regular file.`,path:o.path,functionName:r.name});return}s.push(c);let l;try{l=JSON.parse(e.fs.readFileSync(c,`utf8`))}catch(e){M(i,{code:`payload.invalid-json`,message:`Invalid JSON: ${e.message}`,path:o.path,functionName:r.name});return}let u=a[o.type];u(l)||(u.errors??[]).forEach(e=>M(i,{code:`payload.schema`,message:L(e),path:o.path,functionName:r.name}))})}),{sources:o,payloadPaths:[...new Set(s)]}}function z(e){try{let t=JSON.parse(e),n=Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.nodes)?t.nodes:void 0;return n?new Set(n.flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e.name;return typeof t==`string`?[t]:[]})):new Set}catch{return new Set}}function B(e){switch(b(e)){case`.ts`:case`.tsx`:return`ts`;case`.json`:case`.jsonc`:return`json`;case`.yaml`:case`.yml`:return`yaml`;default:return`ts`}}function V(e,n,r){if(!r)return;let i=j(e.fs.readFileSync(r,`utf8`));if(typeof i?.importMap==`string`){if(/^[a-z][a-z\d+.-]*:/iu.test(i.importMap))return i.importMap;let a=C(y(r),i.importMap);return t(e,n,a),a}let a={};if(i.imports!==void 0&&(a.imports=i.imports),i.scopes!==void 0&&(a.scopes=i.scopes),Object.keys(a).length!==0)return`data:application/json,${encodeURIComponent(JSON.stringify(a))}`}async function H(e,n,r,i,a){let o=[],s=[];for(let c of a){t(e,r,c);let a=e.fs.readFileSync(c,`utf8`),l=await n(`deno`,[`fmt`,...i,`--ext=${B(c)}`,`-`],{cwd:r,input:a},e);if(l.code!==0)throw Error(`Deno could not preview formatting for ${N(r,c)}.${l.stderr.trim()?`\n${l.stderr.trim()}`:``}`);if(l.stdout!==a){let t=N(r,c);o.push(E(t,t,a,l.stdout,``,``,{context:3})),s.push({kind:`file`,path:c,before:a,after:l.stdout,description:`Format ${t}`,mode:e.fs.statSync(c).mode})}}return{patch:o.join(`
1
+ import{i as e}from"./paths-J5KScOaQ.mjs";import{o as t,s as n}from"./project-discovery-CWRjlFnC.mjs";import{a as r}from"./readTranscendYaml-D576bvzR.mjs";import{t as i}from"./parseVariablesFromString-6TYW65LF.mjs";import{t as a}from"./done-input-validation-LiTaCEzF.mjs";import{t as o}from"./missing-manifest-D8y1VL4p.mjs";import{a as s,i as c,l,t as u}from"./project-discovery-g29vd44a.mjs";import{n as d,r as f,t as p}from"./prompts-BhXfYD6g.mjs";import{t as m}from"./run-captured-process-BjaSDWXG.mjs";import{r as h,t as g}from"./deno-runtime-CB2HBach.mjs";import{t as _}from"./module-graph-CAT8_JCG.mjs";import{t as v}from"./project-plan-apply-Bg_1eMX9.mjs";import{dirname as y,extname as b,join as x,relative as S,resolve as C,sep as w}from"node:path";import T from"colors";import{createTwoFilesPatch as E}from"diff";import{DSR_DATAPOINT_CUSTOM_FUNCTION_PAYLOAD_SCHEMA as D,DSR_REQUEST_ENRICHER_CUSTOM_FUNCTION_PAYLOAD_SCHEMA as O,GENERAL_CUSTOM_FUNCTION_PAYLOAD_SCHEMA as k}from"@transcend-io/custom-function-types";import A from"ajv";import{parse as j}from"jsonc-parser";function M(e,t){e.push({severity:`error`,...t})}function N(e,t){return S(e,t).split(w).join(`/`)||`.`}function P(e){let t=t=>e.type===`DSR`?t===`REQUEST_ENRICHER`?`dsr-enricher`:`dsr-datapoint`:`general`;return e[`test-payload`]?[{entry:e,path:e[`test-payload`],type:t(e[`test-payload-type`])}]:(e[`test-payloads`]??[]).map(n=>({entry:e,path:n.payload,type:t(n[`payload-type`])}))}function F(e,t){let n=P(e).map(({type:e})=>e),r=e.type===`DSR`&&n.length===0;return{entry:e,path:C(t,e.code),needsDefault:e.type!==`DSR`||n.includes(`dsr-datapoint`),needsEnricher:n.includes(`dsr-enricher`),needsAnyDsrExport:r}}function I(){let e=new A({allErrors:!0,strict:!1});return{general:e.compile(k),"dsr-datapoint":e.compile(D),"dsr-enricher":e.compile(O)}}function L(e){return`${e.instancePath||`/`} ${e.message??`is invalid`}`}function R(e,t,r,i){let a=I(),o=[],s=[];return r.forEach(r=>{if(/<<parameters\.[^>]+>>/u.test(r.code))M(i,{code:`manifest.unresolved-code-path`,message:`Code paths cannot contain unresolved parameter placeholders.`,path:r.code,functionName:r.name});else if(c(r.code)){let a=F(r,t);e.fs.existsSync(a.path)?n(e,t,a.path)?e.fs.statSync(a.path).isFile()?o.push(a):M(i,{code:`source.not-file`,message:`Referenced source path is not a regular file.`,path:r.code,functionName:r.name}):M(i,{code:`source.outside-project`,message:`Referenced source resolves outside the manifest directory through a symlink.`,path:r.code,functionName:r.name}):M(i,{code:`source.missing`,message:`Referenced source file does not exist.`,path:r.code,functionName:r.name})}P(r).forEach(o=>{if(/<<parameters\.[^>]+>>/u.test(o.path)){M(i,{code:`manifest.unresolved-payload-path`,message:`Payload paths cannot contain unresolved parameter placeholders.`,path:o.path,functionName:r.name});return}let c=C(t,o.path);if(!e.fs.existsSync(c)){M(i,{code:`payload.missing`,message:`Referenced test payload does not exist.`,path:o.path,functionName:r.name});return}if(!n(e,t,c)){M(i,{code:`payload.outside-project`,message:`Referenced test payload resolves outside the manifest directory through a symlink.`,path:o.path,functionName:r.name});return}if(!e.fs.statSync(c).isFile()){M(i,{code:`payload.not-file`,message:`Referenced test payload is not a regular file.`,path:o.path,functionName:r.name});return}s.push(c);let l;try{l=JSON.parse(e.fs.readFileSync(c,`utf8`))}catch(e){M(i,{code:`payload.invalid-json`,message:`Invalid JSON: ${e.message}`,path:o.path,functionName:r.name});return}let u=a[o.type];u(l)||(u.errors??[]).forEach(e=>M(i,{code:`payload.schema`,message:L(e),path:o.path,functionName:r.name}))})}),{sources:o,payloadPaths:[...new Set(s)]}}function z(e){try{let t=JSON.parse(e),n=Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.nodes)?t.nodes:void 0;return n?new Set(n.flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e.name;return typeof t==`string`?[t]:[]})):new Set}catch{return new Set}}function B(e){switch(b(e)){case`.ts`:case`.tsx`:return`ts`;case`.json`:case`.jsonc`:return`json`;case`.yaml`:case`.yml`:return`yaml`;default:return`ts`}}function V(e,n,r){if(!r)return;let i=j(e.fs.readFileSync(r,`utf8`));if(typeof i?.importMap==`string`){if(/^[a-z][a-z\d+.-]*:/iu.test(i.importMap))return i.importMap;let a=C(y(r),i.importMap);return t(e,n,a),a}let a={};if(i.imports!==void 0&&(a.imports=i.imports),i.scopes!==void 0&&(a.scopes=i.scopes),Object.keys(a).length!==0)return`data:application/json,${encodeURIComponent(JSON.stringify(a))}`}async function H(e,n,r,i,a){let o=[],s=[];for(let c of a){t(e,r,c);let a=e.fs.readFileSync(c,`utf8`),l=await n(`deno`,[`fmt`,...i,`--ext=${B(c)}`,`-`],{cwd:r,input:a},e);if(l.code!==0)throw Error(`Deno could not preview formatting for ${N(r,c)}.${l.stderr.trim()?`\n${l.stderr.trim()}`:``}`);if(l.stdout!==a){let t=N(r,c);o.push(E(t,t,a,l.stdout,``,``,{context:3})),s.push({kind:`file`,path:c,before:a,after:l.stdout,description:`Format ${t}`,mode:e.fs.statSync(c).mode})}}return{patch:o.join(`
2
2
  `),changes:s}}function U(e,t,n,r){M(e,{code:t,message:`${n}${r.stderr.trim()?`\n${r.stderr.trim()}`:``}`})}async function W(e,i,a=m){let o=C(i.manifestPath),c=y(o),u=[],d=new Map([[`manifest`,`passed`],[`files`,`passed`],[`payloads`,`passed`],[`runtime`,`passed`],[`exports`,`passed`],[`typecheck`,`passed`],[`lint`,`passed`],[`format`,`passed`]]),f=()=>({version:1,status:u.some(({severity:e})=>e===`error`)?`failed`:`passed`,manifestPath:o,checks:[...d].map(([e,t])=>({name:e,status:t})),diagnostics:u});if(!e.fs.existsSync(o))return M(u,{code:`manifest.missing`,message:`Custom Function manifest does not exist.`,path:N(e.process.cwd(),o)}),d.set(`manifest`,`failed`),[`files`,`payloads`,`runtime`,`exports`,`typecheck`,`lint`,`format`].forEach(e=>d.set(e,`skipped`)),f();let p=[];try{p=s(r(e.fs.readFileSync(o,`utf8`),i.variables??{})).functions}catch(e){return M(u,{code:`manifest.invalid`,message:e.message,path:N(c,o)}),d.set(`manifest`,`failed`),[`files`,`payloads`,`runtime`,`exports`,`typecheck`,`lint`,`format`].forEach(e=>d.set(e,`skipped`)),f()}p.forEach(e=>{try{l({...e.env?{env:e.env}:{},...e[`allowed-hosts`]?{allowedHosts:e[`allowed-hosts`]}:{}})}catch(t){d.set(`manifest`,`failed`),M(u,{code:`manifest.execution-context`,message:t.message,path:N(c,o),functionName:e.name})}});let{sources:b,payloadPaths:S}=R(e,c,p,u);u.some(({code:e})=>[`source.`,`manifest.unresolved-code-path`].some(t=>e.startsWith(t)))&&(d.set(`files`,`failed`),[`exports`,`typecheck`,`lint`].forEach(e=>d.set(e,`failed`))),u.some(({code:e})=>[`payload.`,`manifest.unresolved-payload-path`].some(t=>e.startsWith(t)))&&d.set(`payloads`,`failed`);let w=x(c,`deno.jsonc`),T=x(c,`deno.json`),E=e.fs.existsSync(w)?w:e.fs.existsSync(T)?T:void 0,D=E!==void 0&&!n(e,c,E),O=D,k;if(D)M(u,{code:`deno.config-outside-project`,message:`Deno configuration resolves outside the manifest directory through a symlink.`,path:N(c,E)}),[`exports`,`typecheck`,`lint`,`format`].forEach(e=>d.set(e,`failed`));else try{k=V(e,c,E)}catch(e){O=!0,M(u,{code:`deno.import-map-outside-project`,message:e.message}),[`exports`,`typecheck`,`lint`,`format`].forEach(e=>d.set(e,`failed`))}let A=E&&!O?[`--config=${E}`]:[`--no-config`],j=()=>{[`exports`,`typecheck`,`lint`,`format`].forEach(e=>{d.get(e)!==`failed`&&d.set(e,`skipped`)})},P=await a(`deno`,[`--version`],{cwd:c},e),F=P.code===0?h(P.stdout):void 0;if(F?.level===`warning`&&u.push({code:`deno.version-mismatch`,severity:`warning`,message:F.message}),P.error?.code===`ENOENT`)d.set(`runtime`,`failed`),j(),M(u,{code:`deno.missing`,message:`Deno 2.x is required for export, type, lint, and format checks. Install it from ${g}`});else if(P.code!==0)d.set(`runtime`,`failed`),j(),U(u,`deno.unavailable`,`Deno could not be started.`,P);else if(F?.level===`error`)d.set(`runtime`,`failed`),j(),M(u,{code:`deno.unsupported-version`,message:F.message});else if(!O){for(let t of b){let n=await a(`deno`,[`info`,`--json`,...A,t.path],{cwd:c},e);if(n.code!==0)d.set(`files`,`failed`),U(u,`source.module-graph`,`Could not inspect runtime imports for ${N(c,t.path)}.`,n);else try{let e=_(n.stdout);e.length>0&&(d.set(`files`,`failed`),M(u,{code:`source.local-runtime-import`,message:`Custom Functions must be self-contained. Local or import-map runtime dependencies are not deployed: `+e.join(`, `),path:N(c,t.path),functionName:t.entry.name}))}catch(e){d.set(`files`,`failed`),M(u,{code:`source.module-graph`,message:e.message,path:N(c,t.path),functionName:t.entry.name})}let r=await a(`deno`,[`doc`,`--json`,...k?[`--import-map`,k]:[],t.path],{cwd:c},e);if(r.code!==0){d.set(`exports`,`failed`),U(u,`exports.inspect`,`Could not inspect exports for ${N(c,t.path)}.`,r);continue}let i=z(r.stdout);t.needsDefault&&!i.has(`default`)&&(d.set(`exports`,`failed`),M(u,{code:`exports.default-missing`,message:`The manifest fixtures require a default export.`,path:N(c,t.path),functionName:t.entry.name})),t.needsEnricher&&!i.has(`enricher`)&&(d.set(`exports`,`failed`),M(u,{code:`exports.enricher-missing`,message:"A REQUEST_ENRICHER fixture requires an `enricher` export.",path:N(c,t.path),functionName:t.entry.name})),t.needsAnyDsrExport&&!i.has(`default`)&&!i.has(`enricher`)&&(d.set(`exports`,`failed`),M(u,{code:`exports.dsr-missing`,message:"A DSR Custom Function requires a `default` or `enricher` export.",path:N(c,t.path),functionName:t.entry.name}))}let n=[...new Set(b.map(({path:e})=>e))];if(n.length>0){let t=await a(`deno`,[`check`,...A,...n],{cwd:c},e);t.code!==0&&(d.set(`typecheck`,`failed`),U(u,`deno.typecheck`,`Deno type checking failed.`,t));let r=await a(`deno`,[`lint`,...A,...n],{cwd:c},e);r.code!==0&&(d.set(`lint`,`failed`),U(u,`deno.lint`,`Deno linting failed.`,r))}let r=[...n,...S,o,...E?[E]:[],...k&&k!==E&&!/^[a-z][a-z\d+.-]*:/iu.test(k)?[k]:[]];r.forEach(n=>t(e,c,n));let s=await a(`deno`,[`fmt`,`--check`,...A,...r],{cwd:c},e);if(s.code!==0){let t;try{t=await H(e,a,c,A,r)}catch(e){return d.set(`format`,`failed`),M(u,{code:`deno.format-preview`,message:e.message}),f()}if(t.changes.length===0)return d.set(`format`,`failed`),U(u,`deno.format`,`Deno reported a formatting failure but did not produce a repair.`,s),f();if(i.fix||i.confirmFormat&&await i.confirmFormat(t.patch))try{await v(e,{rootDirectory:c,changes:t.changes})}catch(e){d.set(`format`,`failed`),M(u,{code:`deno.format-fix`,message:`Could not apply formatting transaction: ${e.message}`})}else d.set(`format`,`failed`),t.changes.forEach((e,n)=>{M(u,{code:`deno.format`,message:`Referenced file is not formatted.`+(n===0&&i.includeFormatPatchInDiagnostics&&t.patch?`\n${t.patch}`:``),path:N(c,e.path)})})}}return f()}async function G(t,n){a(this.process);let{manifestPath:r}=e(this.process.cwd(),{...n?{directory:n}:{},...t.manifest?{manifest:t.manifest}:{}}),s=this.fs.existsSync(r)?void 0:o({cwd:this.process.cwd(),manifestPath:r,discoveredManifestPaths:u(this,this.process.cwd()),command:`check`}),c=f(t,this.process.stdin.isTTY,this.process.stderr.isTTY),l=new d(this);try{let e=await W(this,{manifestPath:r,variables:i(t.variables),fix:t.fix,includeFormatPatchInDiagnostics:!t.json,...c&&!t.fix?{confirmFormat:async e=>(e&&this.logger.error(e),l.confirm(`Format the files shown above?`,!0))}:{}});s&&e.diagnostics.forEach(e=>{e.code===`manifest.missing`&&(e.message=s)}),t.json?this.process.stdout.write(`${JSON.stringify(e)}\n`):(this.logger.info(`${T.bold(`Custom Function checks`)}\n`),e.checks.forEach(({name:e,status:t})=>{let n=t===`passed`?`PASS`:t===`failed`?`FAIL`:`SKIP`,r=t===`passed`?T.green(n):t===`failed`?T.red(n):T.yellow(n);this.logger.info(`${r} ${e[0].toUpperCase()}${e.slice(1)}`)}),e.diagnostics.length>0&&this.logger.error(``),e.diagnostics.forEach(e=>{let t=e.path?`${e.path}: `:``,n=e.functionName?`[${e.functionName}] `:``,r=`${e.severity}: ${t}${n}${e.message}`;e.severity===`warning`?this.logger.warn(T.yellow(r)):this.logger.error(T.red(r))}),e.status===`passed`?(this.logger.info(``),this.logger.info(T.green(`Custom Function checks passed.`))):(this.logger.error(``),this.logger.error(T.red(`Custom Function checks failed.`)))),e.status===`failed`&&(this.process.exitCode=1)}catch(e){throw e instanceof p&&this.process.exit(130),e}}export{G as check};
3
- //# sourceMappingURL=impl-BpVe6fMe.mjs.map
3
+ //# sourceMappingURL=impl-yxR3rwGm.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"impl-BpVe6fMe.mjs","names":["parseJsonc"],"sources":["../src/commands/custom-functions/check/helpers.ts","../src/commands/custom-functions/check/impl.ts"],"sourcesContent":["import { dirname, extname, join, relative, resolve, sep } from 'node:path';\n\nimport {\n DSR_DATAPOINT_CUSTOM_FUNCTION_PAYLOAD_SCHEMA,\n DSR_REQUEST_ENRICHER_CUSTOM_FUNCTION_PAYLOAD_SCHEMA,\n GENERAL_CUSTOM_FUNCTION_PAYLOAD_SCHEMA,\n} from '@transcend-io/custom-function-types';\nimport Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport { createTwoFilesPatch } from 'diff';\nimport { parse as parseJsonc } from 'jsonc-parser';\n\nimport type { LocalContext } from '../../../context.js';\nimport {\n runCapturedProcess,\n type CapturedProcessResult,\n type CapturedProcessRunner,\n} from '../../../lib/cli/run-captured-process.js';\nimport {\n type CustomFunctionCheckResult,\n type CustomFunctionCheckStatus,\n type CustomFunctionDiagnostic,\n} from '../../../lib/custom-functions/check-model.js';\nimport {\n DENO_INSTALL_URL,\n getDenoRuntimeCompatibility,\n SUPPORTED_DENO_MAJOR_VERSION,\n} from '../../../lib/custom-functions/deno-runtime.js';\nimport { validateCustomFunctionExecutionContext } from '../../../lib/custom-functions/execution-context.js';\nimport {\n isCustomFunctionManifestPathContained,\n parseCustomFunctionsManifest,\n type CustomFunctionManifestEntry,\n} from '../../../lib/custom-functions/manifest.js';\nimport { findNonSelfContainedRuntimeImports } from '../../../lib/custom-functions/module-graph.js';\nimport { CUSTOM_FUNCTION_RESULT_VERSION } from '../../../lib/custom-functions/scaffold-model.js';\nimport { replaceVariablesInYaml } from '../../../lib/readTranscendYaml.js';\nimport {\n assertPathPhysicallyContained,\n isPathPhysicallyContained,\n} from '../../../lib/scaffolding/path-safety.js';\nimport { applyProjectPlan } from '../../../lib/scaffolding/project-plan-apply.js';\nimport type { PlannedFileChange } from '../../../lib/scaffolding/project-plan.js';\n\n/** Payload file plus its validation contract. */\ninterface PayloadReference {\n /** Manifest entry. */\n entry: CustomFunctionManifestEntry;\n /** Manifest-relative payload path. */\n path: string;\n /** Schema variant. */\n type: 'general' | 'dsr-datapoint' | 'dsr-enricher';\n}\n\n/** Source file plus exports required by fixtures. */\ninterface SourceReference {\n /** Manifest entry. */\n entry: CustomFunctionManifestEntry;\n /** Absolute source path. */\n path: string;\n /** Whether a default export is required. */\n needsDefault: boolean;\n /** Whether an enricher export is required. */\n needsEnricher: boolean;\n /** Whether either DSR export is acceptable when no fixtures identify one. */\n needsAnyDsrExport: boolean;\n}\n\n/** Options for local validation. */\nexport interface RunCustomFunctionChecksOptions {\n /** Absolute manifest path. */\n manifestPath: string;\n /** Variables used to resolve manifest placeholders. */\n variables?: Record<string, string>;\n /** Apply Deno formatting. */\n fix: boolean;\n /** Ask for an interactive formatting repair after receiving a patch. */\n confirmFormat?: (patch: string) => Promise<boolean>;\n /** Include a unified format patch in human-oriented diagnostics. */\n includeFormatPatchInDiagnostics?: boolean;\n}\n\n/**\n * Add one diagnostic.\n *\n * @param diagnostics - Result collection\n * @param diagnostic - Diagnostic without severity\n */\nfunction addError(\n diagnostics: CustomFunctionDiagnostic[],\n diagnostic: Omit<CustomFunctionDiagnostic, 'severity'>,\n): void {\n diagnostics.push({ severity: 'error', ...diagnostic });\n}\n\n/**\n * Normalize an absolute path relative to the manifest.\n *\n * @param manifestDirectory - Manifest directory\n * @param path - Absolute path\n * @returns Portable display path\n */\nfunction relativePath(manifestDirectory: string, path: string): string {\n const value = relative(manifestDirectory, path).split(sep).join('/');\n return value || '.';\n}\n\n/**\n * Select all payload files and schema variants.\n *\n * @param entry - Manifest entry\n * @returns Payload references\n */\nfunction payloadReferences(entry: CustomFunctionManifestEntry): PayloadReference[] {\n const variant = (\n payloadType: 'DATA_POINT' | 'REQUEST_ENRICHER' | undefined,\n ): PayloadReference['type'] => {\n if (entry.type !== 'DSR') {\n return 'general';\n }\n return payloadType === 'REQUEST_ENRICHER' ? 'dsr-enricher' : 'dsr-datapoint';\n };\n if (entry['test-payload']) {\n return [\n {\n entry,\n path: entry['test-payload'],\n type: variant(entry['test-payload-type']),\n },\n ];\n }\n return (entry['test-payloads'] ?? []).map((item) => ({\n entry,\n path: item.payload,\n type: variant(item['payload-type']),\n }));\n}\n\n/**\n * Select export expectations from the registered fixtures.\n *\n * @param entry - Manifest entry\n * @param manifestDirectory - Manifest directory\n * @returns Source reference\n */\nfunction sourceReference(\n entry: CustomFunctionManifestEntry,\n manifestDirectory: string,\n): SourceReference {\n const payloadTypes = payloadReferences(entry).map(({ type }) => type);\n const dsrWithoutPayloads = entry.type === 'DSR' && payloadTypes.length === 0;\n return {\n entry,\n path: resolve(manifestDirectory, entry.code),\n needsDefault: entry.type !== 'DSR' || payloadTypes.includes('dsr-datapoint'),\n needsEnricher: payloadTypes.includes('dsr-enricher'),\n needsAnyDsrExport: dsrWithoutPayloads,\n };\n}\n\n/**\n * Compile published payload schemas.\n *\n * @returns Validators by local variant\n */\nfunction buildPayloadValidators(): Record<PayloadReference['type'], ValidateFunction> {\n const ajv = new Ajv({ allErrors: true, strict: false });\n return {\n general: ajv.compile(GENERAL_CUSTOM_FUNCTION_PAYLOAD_SCHEMA),\n 'dsr-datapoint': ajv.compile(DSR_DATAPOINT_CUSTOM_FUNCTION_PAYLOAD_SCHEMA),\n 'dsr-enricher': ajv.compile(DSR_REQUEST_ENRICHER_CUSTOM_FUNCTION_PAYLOAD_SCHEMA),\n };\n}\n\n/**\n * Format one Ajv failure.\n *\n * @param error - Ajv error\n * @returns Concise path and message\n */\nfunction formatSchemaError(error: ErrorObject): string {\n return `${error.instancePath || '/'} ${error.message ?? 'is invalid'}`;\n}\n\n/**\n * Validate referenced source and payload files without invoking Deno.\n *\n * @param context - CLI context\n * @param manifestDirectory - Manifest directory\n * @param entries - Parsed manifest entries\n * @param diagnostics - Result collection\n * @returns Existing source and format paths\n */\nfunction validateReferencedFiles(\n context: LocalContext,\n manifestDirectory: string,\n entries: readonly CustomFunctionManifestEntry[],\n diagnostics: CustomFunctionDiagnostic[],\n): {\n /** Existing source references. */\n sources: SourceReference[];\n /** Existing payload paths. */\n payloadPaths: string[];\n} {\n const validators = buildPayloadValidators();\n const sources: SourceReference[] = [];\n const payloadPaths: string[] = [];\n entries.forEach((entry) => {\n if (/<<parameters\\.[^>]+>>/u.test(entry.code)) {\n addError(diagnostics, {\n code: 'manifest.unresolved-code-path',\n message: 'Code paths cannot contain unresolved parameter placeholders.',\n path: entry.code,\n functionName: entry.name,\n });\n } else if (isCustomFunctionManifestPathContained(entry.code)) {\n const source = sourceReference(entry, manifestDirectory);\n if (!context.fs.existsSync(source.path)) {\n addError(diagnostics, {\n code: 'source.missing',\n message: 'Referenced source file does not exist.',\n path: entry.code,\n functionName: entry.name,\n });\n } else if (!isPathPhysicallyContained(context, manifestDirectory, source.path)) {\n addError(diagnostics, {\n code: 'source.outside-project',\n message: 'Referenced source resolves outside the manifest directory through a symlink.',\n path: entry.code,\n functionName: entry.name,\n });\n } else if (!context.fs.statSync(source.path).isFile()) {\n addError(diagnostics, {\n code: 'source.not-file',\n message: 'Referenced source path is not a regular file.',\n path: entry.code,\n functionName: entry.name,\n });\n } else {\n sources.push(source);\n }\n }\n\n payloadReferences(entry).forEach((reference) => {\n if (/<<parameters\\.[^>]+>>/u.test(reference.path)) {\n addError(diagnostics, {\n code: 'manifest.unresolved-payload-path',\n message: 'Payload paths cannot contain unresolved parameter placeholders.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n const payloadPath = resolve(manifestDirectory, reference.path);\n if (!context.fs.existsSync(payloadPath)) {\n addError(diagnostics, {\n code: 'payload.missing',\n message: 'Referenced test payload does not exist.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n if (!isPathPhysicallyContained(context, manifestDirectory, payloadPath)) {\n addError(diagnostics, {\n code: 'payload.outside-project',\n message:\n 'Referenced test payload resolves outside the manifest directory through a symlink.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n if (!context.fs.statSync(payloadPath).isFile()) {\n addError(diagnostics, {\n code: 'payload.not-file',\n message: 'Referenced test payload is not a regular file.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n payloadPaths.push(payloadPath);\n let payload: unknown;\n try {\n payload = JSON.parse(context.fs.readFileSync(payloadPath, 'utf8'));\n } catch (error) {\n addError(diagnostics, {\n code: 'payload.invalid-json',\n message: `Invalid JSON: ${(error as Error).message}`,\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n const validate = validators[reference.type];\n if (!validate(payload)) {\n (validate.errors ?? []).forEach((error) =>\n addError(diagnostics, {\n code: 'payload.schema',\n message: formatSchemaError(error),\n path: reference.path,\n functionName: entry.name,\n }),\n );\n }\n });\n });\n return {\n sources,\n payloadPaths: [...new Set(payloadPaths)],\n };\n}\n\n/**\n * Read Deno's JSON documentation output for exported names.\n *\n * @param output - `deno doc --json` output\n * @returns Exported names\n */\nfunction exportedNames(output: string): Set<string> {\n try {\n const document = JSON.parse(output) as unknown;\n const nodes = Array.isArray(document)\n ? document\n : document &&\n typeof document === 'object' &&\n Array.isArray((document as Record<string, unknown>).nodes)\n ? ((document as Record<string, unknown>).nodes as unknown[])\n : undefined;\n if (!nodes) {\n return new Set();\n }\n return new Set(\n nodes.flatMap((node) => {\n if (!node || typeof node !== 'object') {\n return [];\n }\n const name = (node as Record<string, unknown>).name;\n return typeof name === 'string' ? [name] : [];\n }),\n );\n } catch {\n return new Set();\n }\n}\n\n/**\n * Choose the Deno formatter extension for stdin.\n *\n * @param path - Source path\n * @returns Deno extension\n */\nfunction denoExtension(path: string): string {\n switch (extname(path)) {\n case '.ts':\n case '.tsx':\n return 'ts';\n case '.json':\n case '.jsonc':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n default:\n return 'ts';\n }\n}\n\n/**\n * Resolve the import-map input supported by `deno doc`.\n *\n * Deno 2.4 does not expose `--config` for `doc`. A full `deno.json` is not a\n * valid import map when it also has `tasks`, `lint`, `fmt`, or\n * `compilerOptions`, so inline `imports` / `scopes` are passed as a data URL.\n * An `importMap` reference is followed explicitly.\n *\n * @param context - CLI context\n * @param manifestDirectory - Approved project root\n * @param configPath - Selected Deno config\n * @returns Import map path or URL\n */\nfunction resolveDocImportMap(\n context: LocalContext,\n manifestDirectory: string,\n configPath: string | undefined,\n): string | undefined {\n if (!configPath) {\n return undefined;\n }\n const config = parseJsonc(context.fs.readFileSync(configPath, 'utf8')) as {\n /** Optional separate import map. */\n importMap?: unknown;\n /** Inline import map entries. */\n imports?: unknown;\n /** Inline import map scopes. */\n scopes?: unknown;\n };\n if (typeof config?.importMap === 'string') {\n if (/^[a-z][a-z\\d+.-]*:/iu.test(config.importMap)) {\n return config.importMap;\n }\n const importMapPath = resolve(dirname(configPath), config.importMap);\n assertPathPhysicallyContained(context, manifestDirectory, importMapPath);\n return importMapPath;\n }\n const importMap: {\n /** Bare-specifier remappings. */\n imports?: unknown;\n /** Scoped remappings. */\n scopes?: unknown;\n } = {};\n if (config.imports !== undefined) {\n importMap.imports = config.imports;\n }\n if (config.scopes !== undefined) {\n importMap.scopes = config.scopes;\n }\n if (Object.keys(importMap).length === 0) {\n return undefined;\n }\n return `data:application/json,${encodeURIComponent(JSON.stringify(importMap))}`;\n}\n\n/**\n * Render deterministic formatter patches without changing files.\n *\n * @param context - CLI context\n * @param runner - Process runner\n * @param manifestDirectory - Working directory\n * @param configArgs - Deno config arguments\n * @param paths - Target files\n * @returns Unified patches and transactional file changes\n */\nasync function buildFormatPlan(\n context: LocalContext,\n runner: CapturedProcessRunner,\n manifestDirectory: string,\n configArgs: readonly string[],\n paths: readonly string[],\n): Promise<{ patch: string; changes: PlannedFileChange[] }> {\n const patches: string[] = [];\n const changes: PlannedFileChange[] = [];\n for (const path of paths) {\n assertPathPhysicallyContained(context, manifestDirectory, path);\n const before = context.fs.readFileSync(path, 'utf8');\n const result = await runner(\n 'deno',\n ['fmt', ...configArgs, `--ext=${denoExtension(path)}`, '-'],\n { cwd: manifestDirectory, input: before },\n context,\n );\n if (result.code !== 0) {\n throw new Error(\n `Deno could not preview formatting for ${relativePath(manifestDirectory, path)}.${\n result.stderr.trim() ? `\\n${result.stderr.trim()}` : ''\n }`,\n );\n }\n if (result.stdout !== before) {\n const display = relativePath(manifestDirectory, path);\n patches.push(\n createTwoFilesPatch(display, display, before, result.stdout, '', '', { context: 3 }),\n );\n changes.push({\n kind: 'file',\n path,\n before,\n after: result.stdout,\n description: `Format ${display}`,\n mode: context.fs.statSync(path).mode,\n });\n }\n }\n return { patch: patches.join('\\n'), changes };\n}\n\n/**\n * Record one Deno command failure.\n *\n * @param diagnostics - Result collection\n * @param code - Stable code\n * @param message - Summary\n * @param result - Captured process result\n */\nfunction recordDenoFailure(\n diagnostics: CustomFunctionDiagnostic[],\n code: string,\n message: string,\n result: CapturedProcessResult,\n): void {\n addError(diagnostics, {\n code,\n message: `${message}${result.stderr.trim() ? `\\n${result.stderr.trim()}` : ''}`,\n });\n}\n\n/**\n * Run credential-free local validation without executing user modules.\n *\n * @param context - CLI context\n * @param options - Manifest and format behavior\n * @param runner - Captured process runner\n * @returns Stable check result\n */\nexport async function runCustomFunctionChecks(\n context: LocalContext,\n options: RunCustomFunctionChecksOptions,\n runner: CapturedProcessRunner = runCapturedProcess,\n): Promise<CustomFunctionCheckResult> {\n const manifestPath = resolve(options.manifestPath);\n const manifestDirectory = dirname(manifestPath);\n const diagnostics: CustomFunctionDiagnostic[] = [];\n const statuses = new Map<string, CustomFunctionCheckStatus>([\n ['manifest', 'passed'],\n ['files', 'passed'],\n ['payloads', 'passed'],\n ['runtime', 'passed'],\n ['exports', 'passed'],\n ['typecheck', 'passed'],\n ['lint', 'passed'],\n ['format', 'passed'],\n ]);\n const buildResult = (): CustomFunctionCheckResult => ({\n version: CUSTOM_FUNCTION_RESULT_VERSION,\n status: diagnostics.some(({ severity }) => severity === 'error') ? 'failed' : 'passed',\n manifestPath,\n checks: [...statuses].map(([name, status]) => ({ name, status })),\n diagnostics,\n });\n if (!context.fs.existsSync(manifestPath)) {\n addError(diagnostics, {\n code: 'manifest.missing',\n message: 'Custom Function manifest does not exist.',\n path: relativePath(context.process.cwd(), manifestPath),\n });\n statuses.set('manifest', 'failed');\n ['files', 'payloads', 'runtime', 'exports', 'typecheck', 'lint', 'format'].forEach((name) =>\n statuses.set(name, 'skipped'),\n );\n return buildResult();\n }\n\n let entries: readonly CustomFunctionManifestEntry[] = [];\n try {\n const manifestContents = replaceVariablesInYaml(\n context.fs.readFileSync(manifestPath, 'utf8'),\n options.variables ?? {},\n );\n entries = parseCustomFunctionsManifest(manifestContents).functions;\n } catch (error) {\n addError(diagnostics, {\n code: 'manifest.invalid',\n message: (error as Error).message,\n path: relativePath(manifestDirectory, manifestPath),\n });\n statuses.set('manifest', 'failed');\n ['files', 'payloads', 'runtime', 'exports', 'typecheck', 'lint', 'format'].forEach((name) =>\n statuses.set(name, 'skipped'),\n );\n return buildResult();\n }\n entries.forEach((entry) => {\n try {\n validateCustomFunctionExecutionContext({\n ...(entry.env ? { env: entry.env } : {}),\n ...(entry['allowed-hosts'] ? { allowedHosts: entry['allowed-hosts'] } : {}),\n });\n } catch (error) {\n statuses.set('manifest', 'failed');\n addError(diagnostics, {\n code: 'manifest.execution-context',\n message: (error as Error).message,\n path: relativePath(manifestDirectory, manifestPath),\n functionName: entry.name,\n });\n }\n });\n\n const { sources, payloadPaths } = validateReferencedFiles(\n context,\n manifestDirectory,\n entries,\n diagnostics,\n );\n if (\n diagnostics.some(({ code }) =>\n ['source.', 'manifest.unresolved-code-path'].some((prefix) => code.startsWith(prefix)),\n )\n ) {\n statuses.set('files', 'failed');\n ['exports', 'typecheck', 'lint'].forEach((name) => statuses.set(name, 'failed'));\n }\n if (\n diagnostics.some(({ code }) =>\n ['payload.', 'manifest.unresolved-payload-path'].some((prefix) => code.startsWith(prefix)),\n )\n ) {\n statuses.set('payloads', 'failed');\n }\n\n const denoJsonc = join(manifestDirectory, 'deno.jsonc');\n const denoJson = join(manifestDirectory, 'deno.json');\n const configPath = context.fs.existsSync(denoJsonc)\n ? denoJsonc\n : context.fs.existsSync(denoJson)\n ? denoJson\n : undefined;\n const unsafeConfig =\n configPath !== undefined && !isPathPhysicallyContained(context, manifestDirectory, configPath);\n let unsafeConfiguration = unsafeConfig;\n let docImportMap: string | undefined;\n if (unsafeConfig) {\n addError(diagnostics, {\n code: 'deno.config-outside-project',\n message: 'Deno configuration resolves outside the manifest directory through a symlink.',\n path: relativePath(manifestDirectory, configPath),\n });\n ['exports', 'typecheck', 'lint', 'format'].forEach((name) => statuses.set(name, 'failed'));\n } else {\n try {\n docImportMap = resolveDocImportMap(context, manifestDirectory, configPath);\n } catch (error) {\n unsafeConfiguration = true;\n addError(diagnostics, {\n code: 'deno.import-map-outside-project',\n message: (error as Error).message,\n });\n ['exports', 'typecheck', 'lint', 'format'].forEach((name) => statuses.set(name, 'failed'));\n }\n }\n const configArgs =\n configPath && !unsafeConfiguration ? [`--config=${configPath}`] : ['--no-config'];\n const skipPendingDenoChecks = (): void => {\n ['exports', 'typecheck', 'lint', 'format'].forEach((name) => {\n if (statuses.get(name) !== 'failed') {\n statuses.set(name, 'skipped');\n }\n });\n };\n const denoVersion = await runner('deno', ['--version'], { cwd: manifestDirectory }, context);\n const compatibility =\n denoVersion.code === 0 ? getDenoRuntimeCompatibility(denoVersion.stdout) : undefined;\n if (compatibility?.level === 'warning') {\n diagnostics.push({\n code: 'deno.version-mismatch',\n severity: 'warning',\n message: compatibility.message,\n });\n }\n if (denoVersion.error?.code === 'ENOENT') {\n statuses.set('runtime', 'failed');\n skipPendingDenoChecks();\n addError(diagnostics, {\n code: 'deno.missing',\n message: `Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is required for export, type, lint, and format checks. Install it from ${DENO_INSTALL_URL}`,\n });\n } else if (denoVersion.code !== 0) {\n statuses.set('runtime', 'failed');\n skipPendingDenoChecks();\n recordDenoFailure(diagnostics, 'deno.unavailable', 'Deno could not be started.', denoVersion);\n } else if (compatibility?.level === 'error') {\n statuses.set('runtime', 'failed');\n skipPendingDenoChecks();\n addError(diagnostics, {\n code: 'deno.unsupported-version',\n message: compatibility.message,\n });\n } else if (!unsafeConfiguration) {\n for (const source of sources) {\n const moduleGraph = await runner(\n 'deno',\n ['info', '--json', ...configArgs, source.path],\n { cwd: manifestDirectory },\n context,\n );\n if (moduleGraph.code !== 0) {\n statuses.set('files', 'failed');\n recordDenoFailure(\n diagnostics,\n 'source.module-graph',\n `Could not inspect runtime imports for ${relativePath(manifestDirectory, source.path)}.`,\n moduleGraph,\n );\n } else {\n try {\n const unsupportedImports = findNonSelfContainedRuntimeImports(moduleGraph.stdout);\n if (unsupportedImports.length > 0) {\n statuses.set('files', 'failed');\n addError(diagnostics, {\n code: 'source.local-runtime-import',\n message:\n 'Custom Functions must be self-contained. Local or import-map runtime dependencies are not deployed: ' +\n unsupportedImports.join(', '),\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n } catch (error) {\n statuses.set('files', 'failed');\n addError(diagnostics, {\n code: 'source.module-graph',\n message: (error as Error).message,\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n }\n const result = await runner(\n 'deno',\n ['doc', '--json', ...(docImportMap ? ['--import-map', docImportMap] : []), source.path],\n { cwd: manifestDirectory },\n context,\n );\n if (result.code !== 0) {\n statuses.set('exports', 'failed');\n recordDenoFailure(\n diagnostics,\n 'exports.inspect',\n `Could not inspect exports for ${relativePath(manifestDirectory, source.path)}.`,\n result,\n );\n continue;\n }\n const names = exportedNames(result.stdout);\n if (source.needsDefault && !names.has('default')) {\n statuses.set('exports', 'failed');\n addError(diagnostics, {\n code: 'exports.default-missing',\n message: 'The manifest fixtures require a default export.',\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n if (source.needsEnricher && !names.has('enricher')) {\n statuses.set('exports', 'failed');\n addError(diagnostics, {\n code: 'exports.enricher-missing',\n message: 'A REQUEST_ENRICHER fixture requires an `enricher` export.',\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n if (source.needsAnyDsrExport && !names.has('default') && !names.has('enricher')) {\n statuses.set('exports', 'failed');\n addError(diagnostics, {\n code: 'exports.dsr-missing',\n message: 'A DSR Custom Function requires a `default` or `enricher` export.',\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n }\n\n const sourcePaths = [...new Set(sources.map(({ path }) => path))];\n if (sourcePaths.length > 0) {\n const typecheck = await runner(\n 'deno',\n ['check', ...configArgs, ...sourcePaths],\n { cwd: manifestDirectory },\n context,\n );\n if (typecheck.code !== 0) {\n statuses.set('typecheck', 'failed');\n recordDenoFailure(diagnostics, 'deno.typecheck', 'Deno type checking failed.', typecheck);\n }\n const lint = await runner(\n 'deno',\n ['lint', ...configArgs, ...sourcePaths],\n { cwd: manifestDirectory },\n context,\n );\n if (lint.code !== 0) {\n statuses.set('lint', 'failed');\n recordDenoFailure(diagnostics, 'deno.lint', 'Deno linting failed.', lint);\n }\n }\n\n const formatPaths = [\n ...sourcePaths,\n ...payloadPaths,\n manifestPath,\n ...(configPath ? [configPath] : []),\n ...(docImportMap && docImportMap !== configPath && !/^[a-z][a-z\\d+.-]*:/iu.test(docImportMap)\n ? [docImportMap]\n : []),\n ];\n formatPaths.forEach((path) => assertPathPhysicallyContained(context, manifestDirectory, path));\n const format = await runner(\n 'deno',\n ['fmt', '--check', ...configArgs, ...formatPaths],\n { cwd: manifestDirectory },\n context,\n );\n if (format.code !== 0) {\n let formatPlan: Awaited<ReturnType<typeof buildFormatPlan>>;\n try {\n formatPlan = await buildFormatPlan(\n context,\n runner,\n manifestDirectory,\n configArgs,\n formatPaths,\n );\n } catch (error) {\n statuses.set('format', 'failed');\n addError(diagnostics, {\n code: 'deno.format-preview',\n message: (error as Error).message,\n });\n return buildResult();\n }\n if (formatPlan.changes.length === 0) {\n statuses.set('format', 'failed');\n recordDenoFailure(\n diagnostics,\n 'deno.format',\n 'Deno reported a formatting failure but did not produce a repair.',\n format,\n );\n return buildResult();\n }\n const shouldFix =\n options.fix ||\n (options.confirmFormat ? await options.confirmFormat(formatPlan.patch) : false);\n if (shouldFix) {\n try {\n await applyProjectPlan(context, {\n rootDirectory: manifestDirectory,\n changes: formatPlan.changes,\n });\n } catch (error) {\n statuses.set('format', 'failed');\n addError(diagnostics, {\n code: 'deno.format-fix',\n message: `Could not apply formatting transaction: ${(error as Error).message}`,\n });\n }\n } else {\n statuses.set('format', 'failed');\n formatPlan.changes.forEach((change, index) => {\n addError(diagnostics, {\n code: 'deno.format',\n message:\n 'Referenced file is not formatted.' +\n (index === 0 && options.includeFormatPatchInDiagnostics && formatPlan.patch\n ? `\\n${formatPlan.patch}`\n : ''),\n path: relativePath(manifestDirectory, change.path),\n });\n });\n }\n }\n }\n\n return buildResult();\n}\n","import colors from 'colors';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { formatMissingManifestMessage } from '../../../lib/custom-functions/missing-manifest.js';\nimport { resolveCustomFunctionProjectPaths } from '../../../lib/custom-functions/paths.js';\nimport { discoverCustomFunctionManifests } from '../../../lib/custom-functions/project-discovery.js';\nimport { parseVariablesFromString } from '../../../lib/helpers/parseVariablesFromString.js';\nimport {\n isInteractivePromptInvocation,\n PromptCancelledError,\n ScaffoldPrompts,\n} from '../../../lib/scaffolding/prompts.js';\nimport { runCustomFunctionChecks } from './helpers.js';\n\n/** CLI flags for `transcend custom-functions check`. */\nexport interface CustomFunctionsCheckFlags {\n /** Explicit manifest path. */\n manifest?: string;\n /** Manifest variable substitutions. */\n variables: string;\n /** Apply Deno formatting. */\n fix: boolean;\n /** Disable prompts. */\n noInteractive: boolean;\n /** Emit JSON on stdout. */\n json: boolean;\n}\n\n/**\n * Validate a local Custom Function project without credentials.\n *\n * @param this - CLI context\n * @param flags - Check and interaction flags\n * @param directory - Optional target directory\n */\nexport async function check(\n this: LocalContext,\n flags: CustomFunctionsCheckFlags,\n directory?: string,\n): Promise<void> {\n doneInputValidation(this.process);\n const { manifestPath } = resolveCustomFunctionProjectPaths(this.process.cwd(), {\n ...(directory ? { directory } : {}),\n ...(flags.manifest ? { manifest: flags.manifest } : {}),\n });\n const missingMessage = this.fs.existsSync(manifestPath)\n ? undefined\n : formatMissingManifestMessage({\n cwd: this.process.cwd(),\n manifestPath,\n discoveredManifestPaths: discoverCustomFunctionManifests(this, this.process.cwd()),\n command: 'check',\n });\n const interactive = isInteractivePromptInvocation(\n flags,\n this.process.stdin.isTTY,\n this.process.stderr.isTTY,\n );\n const prompts = new ScaffoldPrompts(this);\n try {\n const result = await runCustomFunctionChecks(this, {\n manifestPath,\n variables: parseVariablesFromString(flags.variables),\n fix: flags.fix,\n includeFormatPatchInDiagnostics: !flags.json,\n ...(interactive && !flags.fix\n ? {\n confirmFormat: async (patch: string): Promise<boolean> => {\n if (patch) {\n this.logger.error(patch);\n }\n return prompts.confirm('Format the files shown above?', true);\n },\n }\n : {}),\n });\n if (missingMessage) {\n result.diagnostics.forEach((diagnostic) => {\n if (diagnostic.code === 'manifest.missing') {\n diagnostic.message = missingMessage;\n }\n });\n }\n if (flags.json) {\n this.process.stdout.write(`${JSON.stringify(result)}\\n`);\n } else {\n this.logger.info(`${colors.bold('Custom Function checks')}\\n`);\n result.checks.forEach(({ name, status }) => {\n const label = status === 'passed' ? 'PASS' : status === 'failed' ? 'FAIL' : 'SKIP';\n const styledLabel =\n status === 'passed'\n ? colors.green(label)\n : status === 'failed'\n ? colors.red(label)\n : colors.yellow(label);\n this.logger.info(`${styledLabel} ${name[0]!.toUpperCase()}${name.slice(1)}`);\n });\n if (result.diagnostics.length > 0) {\n this.logger.error('');\n }\n result.diagnostics.forEach((diagnostic) => {\n const location = diagnostic.path ? `${diagnostic.path}: ` : '';\n const owner = diagnostic.functionName ? `[${diagnostic.functionName}] ` : '';\n const message = `${diagnostic.severity}: ${location}${owner}${diagnostic.message}`;\n if (diagnostic.severity === 'warning') {\n this.logger.warn(colors.yellow(message));\n } else {\n this.logger.error(colors.red(message));\n }\n });\n if (result.status === 'passed') {\n this.logger.info('');\n this.logger.info(colors.green('Custom Function checks passed.'));\n } else {\n this.logger.error('');\n this.logger.error(colors.red('Custom Function checks failed.'));\n }\n }\n if (result.status === 'failed') {\n this.process.exitCode = 1;\n }\n } catch (error) {\n if (error instanceof PromptCancelledError) {\n this.process.exit(130);\n }\n throw error;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"impl-yxR3rwGm.mjs","names":["parseJsonc"],"sources":["../src/commands/custom-functions/check/helpers.ts","../src/commands/custom-functions/check/impl.ts"],"sourcesContent":["import { dirname, extname, join, relative, resolve, sep } from 'node:path';\n\nimport {\n DSR_DATAPOINT_CUSTOM_FUNCTION_PAYLOAD_SCHEMA,\n DSR_REQUEST_ENRICHER_CUSTOM_FUNCTION_PAYLOAD_SCHEMA,\n GENERAL_CUSTOM_FUNCTION_PAYLOAD_SCHEMA,\n} from '@transcend-io/custom-function-types';\nimport Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport { createTwoFilesPatch } from 'diff';\nimport { parse as parseJsonc } from 'jsonc-parser';\n\nimport type { LocalContext } from '../../../context.js';\nimport {\n runCapturedProcess,\n type CapturedProcessResult,\n type CapturedProcessRunner,\n} from '../../../lib/cli/run-captured-process.js';\nimport {\n type CustomFunctionCheckResult,\n type CustomFunctionCheckStatus,\n type CustomFunctionDiagnostic,\n} from '../../../lib/custom-functions/check-model.js';\nimport {\n DENO_INSTALL_URL,\n getDenoRuntimeCompatibility,\n SUPPORTED_DENO_MAJOR_VERSION,\n} from '../../../lib/custom-functions/deno-runtime.js';\nimport { validateCustomFunctionExecutionContext } from '../../../lib/custom-functions/execution-context.js';\nimport {\n isCustomFunctionManifestPathContained,\n parseCustomFunctionsManifest,\n type CustomFunctionManifestEntry,\n} from '../../../lib/custom-functions/manifest.js';\nimport { findNonSelfContainedRuntimeImports } from '../../../lib/custom-functions/module-graph.js';\nimport { CUSTOM_FUNCTION_RESULT_VERSION } from '../../../lib/custom-functions/scaffold-model.js';\nimport { replaceVariablesInYaml } from '../../../lib/readTranscendYaml.js';\nimport {\n assertPathPhysicallyContained,\n isPathPhysicallyContained,\n} from '../../../lib/scaffolding/path-safety.js';\nimport { applyProjectPlan } from '../../../lib/scaffolding/project-plan-apply.js';\nimport type { PlannedFileChange } from '../../../lib/scaffolding/project-plan.js';\n\n/** Payload file plus its validation contract. */\ninterface PayloadReference {\n /** Manifest entry. */\n entry: CustomFunctionManifestEntry;\n /** Manifest-relative payload path. */\n path: string;\n /** Schema variant. */\n type: 'general' | 'dsr-datapoint' | 'dsr-enricher';\n}\n\n/** Source file plus exports required by fixtures. */\ninterface SourceReference {\n /** Manifest entry. */\n entry: CustomFunctionManifestEntry;\n /** Absolute source path. */\n path: string;\n /** Whether a default export is required. */\n needsDefault: boolean;\n /** Whether an enricher export is required. */\n needsEnricher: boolean;\n /** Whether either DSR export is acceptable when no fixtures identify one. */\n needsAnyDsrExport: boolean;\n}\n\n/** Options for local validation. */\nexport interface RunCustomFunctionChecksOptions {\n /** Absolute manifest path. */\n manifestPath: string;\n /** Variables used to resolve manifest placeholders. */\n variables?: Record<string, string>;\n /** Apply Deno formatting. */\n fix: boolean;\n /** Ask for an interactive formatting repair after receiving a patch. */\n confirmFormat?: (patch: string) => Promise<boolean>;\n /** Include a unified format patch in human-oriented diagnostics. */\n includeFormatPatchInDiagnostics?: boolean;\n}\n\n/**\n * Add one diagnostic.\n *\n * @param diagnostics - Result collection\n * @param diagnostic - Diagnostic without severity\n */\nfunction addError(\n diagnostics: CustomFunctionDiagnostic[],\n diagnostic: Omit<CustomFunctionDiagnostic, 'severity'>,\n): void {\n diagnostics.push({ severity: 'error', ...diagnostic });\n}\n\n/**\n * Normalize an absolute path relative to the manifest.\n *\n * @param manifestDirectory - Manifest directory\n * @param path - Absolute path\n * @returns Portable display path\n */\nfunction relativePath(manifestDirectory: string, path: string): string {\n const value = relative(manifestDirectory, path).split(sep).join('/');\n return value || '.';\n}\n\n/**\n * Select all payload files and schema variants.\n *\n * @param entry - Manifest entry\n * @returns Payload references\n */\nfunction payloadReferences(entry: CustomFunctionManifestEntry): PayloadReference[] {\n const variant = (\n payloadType: 'DATA_POINT' | 'REQUEST_ENRICHER' | undefined,\n ): PayloadReference['type'] => {\n if (entry.type !== 'DSR') {\n return 'general';\n }\n return payloadType === 'REQUEST_ENRICHER' ? 'dsr-enricher' : 'dsr-datapoint';\n };\n if (entry['test-payload']) {\n return [\n {\n entry,\n path: entry['test-payload'],\n type: variant(entry['test-payload-type']),\n },\n ];\n }\n return (entry['test-payloads'] ?? []).map((item) => ({\n entry,\n path: item.payload,\n type: variant(item['payload-type']),\n }));\n}\n\n/**\n * Select export expectations from the registered fixtures.\n *\n * @param entry - Manifest entry\n * @param manifestDirectory - Manifest directory\n * @returns Source reference\n */\nfunction sourceReference(\n entry: CustomFunctionManifestEntry,\n manifestDirectory: string,\n): SourceReference {\n const payloadTypes = payloadReferences(entry).map(({ type }) => type);\n const dsrWithoutPayloads = entry.type === 'DSR' && payloadTypes.length === 0;\n return {\n entry,\n path: resolve(manifestDirectory, entry.code),\n needsDefault: entry.type !== 'DSR' || payloadTypes.includes('dsr-datapoint'),\n needsEnricher: payloadTypes.includes('dsr-enricher'),\n needsAnyDsrExport: dsrWithoutPayloads,\n };\n}\n\n/**\n * Compile published payload schemas.\n *\n * @returns Validators by local variant\n */\nfunction buildPayloadValidators(): Record<PayloadReference['type'], ValidateFunction> {\n const ajv = new Ajv({ allErrors: true, strict: false });\n return {\n general: ajv.compile(GENERAL_CUSTOM_FUNCTION_PAYLOAD_SCHEMA),\n 'dsr-datapoint': ajv.compile(DSR_DATAPOINT_CUSTOM_FUNCTION_PAYLOAD_SCHEMA),\n 'dsr-enricher': ajv.compile(DSR_REQUEST_ENRICHER_CUSTOM_FUNCTION_PAYLOAD_SCHEMA),\n };\n}\n\n/**\n * Format one Ajv failure.\n *\n * @param error - Ajv error\n * @returns Concise path and message\n */\nfunction formatSchemaError(error: ErrorObject): string {\n return `${error.instancePath || '/'} ${error.message ?? 'is invalid'}`;\n}\n\n/**\n * Validate referenced source and payload files without invoking Deno.\n *\n * @param context - CLI context\n * @param manifestDirectory - Manifest directory\n * @param entries - Parsed manifest entries\n * @param diagnostics - Result collection\n * @returns Existing source and format paths\n */\nfunction validateReferencedFiles(\n context: LocalContext,\n manifestDirectory: string,\n entries: readonly CustomFunctionManifestEntry[],\n diagnostics: CustomFunctionDiagnostic[],\n): {\n /** Existing source references. */\n sources: SourceReference[];\n /** Existing payload paths. */\n payloadPaths: string[];\n} {\n const validators = buildPayloadValidators();\n const sources: SourceReference[] = [];\n const payloadPaths: string[] = [];\n entries.forEach((entry) => {\n if (/<<parameters\\.[^>]+>>/u.test(entry.code)) {\n addError(diagnostics, {\n code: 'manifest.unresolved-code-path',\n message: 'Code paths cannot contain unresolved parameter placeholders.',\n path: entry.code,\n functionName: entry.name,\n });\n } else if (isCustomFunctionManifestPathContained(entry.code)) {\n const source = sourceReference(entry, manifestDirectory);\n if (!context.fs.existsSync(source.path)) {\n addError(diagnostics, {\n code: 'source.missing',\n message: 'Referenced source file does not exist.',\n path: entry.code,\n functionName: entry.name,\n });\n } else if (!isPathPhysicallyContained(context, manifestDirectory, source.path)) {\n addError(diagnostics, {\n code: 'source.outside-project',\n message: 'Referenced source resolves outside the manifest directory through a symlink.',\n path: entry.code,\n functionName: entry.name,\n });\n } else if (!context.fs.statSync(source.path).isFile()) {\n addError(diagnostics, {\n code: 'source.not-file',\n message: 'Referenced source path is not a regular file.',\n path: entry.code,\n functionName: entry.name,\n });\n } else {\n sources.push(source);\n }\n }\n\n payloadReferences(entry).forEach((reference) => {\n if (/<<parameters\\.[^>]+>>/u.test(reference.path)) {\n addError(diagnostics, {\n code: 'manifest.unresolved-payload-path',\n message: 'Payload paths cannot contain unresolved parameter placeholders.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n const payloadPath = resolve(manifestDirectory, reference.path);\n if (!context.fs.existsSync(payloadPath)) {\n addError(diagnostics, {\n code: 'payload.missing',\n message: 'Referenced test payload does not exist.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n if (!isPathPhysicallyContained(context, manifestDirectory, payloadPath)) {\n addError(diagnostics, {\n code: 'payload.outside-project',\n message:\n 'Referenced test payload resolves outside the manifest directory through a symlink.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n if (!context.fs.statSync(payloadPath).isFile()) {\n addError(diagnostics, {\n code: 'payload.not-file',\n message: 'Referenced test payload is not a regular file.',\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n payloadPaths.push(payloadPath);\n let payload: unknown;\n try {\n payload = JSON.parse(context.fs.readFileSync(payloadPath, 'utf8'));\n } catch (error) {\n addError(diagnostics, {\n code: 'payload.invalid-json',\n message: `Invalid JSON: ${(error as Error).message}`,\n path: reference.path,\n functionName: entry.name,\n });\n return;\n }\n const validate = validators[reference.type];\n if (!validate(payload)) {\n (validate.errors ?? []).forEach((error) =>\n addError(diagnostics, {\n code: 'payload.schema',\n message: formatSchemaError(error),\n path: reference.path,\n functionName: entry.name,\n }),\n );\n }\n });\n });\n return {\n sources,\n payloadPaths: [...new Set(payloadPaths)],\n };\n}\n\n/**\n * Read Deno's JSON documentation output for exported names.\n *\n * @param output - `deno doc --json` output\n * @returns Exported names\n */\nfunction exportedNames(output: string): Set<string> {\n try {\n const document = JSON.parse(output) as unknown;\n const nodes = Array.isArray(document)\n ? document\n : document &&\n typeof document === 'object' &&\n Array.isArray((document as Record<string, unknown>).nodes)\n ? ((document as Record<string, unknown>).nodes as unknown[])\n : undefined;\n if (!nodes) {\n return new Set();\n }\n return new Set(\n nodes.flatMap((node) => {\n if (!node || typeof node !== 'object') {\n return [];\n }\n const name = (node as Record<string, unknown>).name;\n return typeof name === 'string' ? [name] : [];\n }),\n );\n } catch {\n return new Set();\n }\n}\n\n/**\n * Choose the Deno formatter extension for stdin.\n *\n * @param path - Source path\n * @returns Deno extension\n */\nfunction denoExtension(path: string): string {\n switch (extname(path)) {\n case '.ts':\n case '.tsx':\n return 'ts';\n case '.json':\n case '.jsonc':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n default:\n return 'ts';\n }\n}\n\n/**\n * Resolve the import-map input supported by `deno doc`.\n *\n * Deno 2.4 does not expose `--config` for `doc`. A full `deno.json` is not a\n * valid import map when it also has `tasks`, `lint`, `fmt`, or\n * `compilerOptions`, so inline `imports` / `scopes` are passed as a data URL.\n * An `importMap` reference is followed explicitly.\n *\n * @param context - CLI context\n * @param manifestDirectory - Approved project root\n * @param configPath - Selected Deno config\n * @returns Import map path or URL\n */\nfunction resolveDocImportMap(\n context: LocalContext,\n manifestDirectory: string,\n configPath: string | undefined,\n): string | undefined {\n if (!configPath) {\n return undefined;\n }\n const config = parseJsonc(context.fs.readFileSync(configPath, 'utf8')) as {\n /** Optional separate import map. */\n importMap?: unknown;\n /** Inline import map entries. */\n imports?: unknown;\n /** Inline import map scopes. */\n scopes?: unknown;\n };\n if (typeof config?.importMap === 'string') {\n if (/^[a-z][a-z\\d+.-]*:/iu.test(config.importMap)) {\n return config.importMap;\n }\n const importMapPath = resolve(dirname(configPath), config.importMap);\n assertPathPhysicallyContained(context, manifestDirectory, importMapPath);\n return importMapPath;\n }\n const importMap: {\n /** Bare-specifier remappings. */\n imports?: unknown;\n /** Scoped remappings. */\n scopes?: unknown;\n } = {};\n if (config.imports !== undefined) {\n importMap.imports = config.imports;\n }\n if (config.scopes !== undefined) {\n importMap.scopes = config.scopes;\n }\n if (Object.keys(importMap).length === 0) {\n return undefined;\n }\n return `data:application/json,${encodeURIComponent(JSON.stringify(importMap))}`;\n}\n\n/**\n * Render deterministic formatter patches without changing files.\n *\n * @param context - CLI context\n * @param runner - Process runner\n * @param manifestDirectory - Working directory\n * @param configArgs - Deno config arguments\n * @param paths - Target files\n * @returns Unified patches and transactional file changes\n */\nasync function buildFormatPlan(\n context: LocalContext,\n runner: CapturedProcessRunner,\n manifestDirectory: string,\n configArgs: readonly string[],\n paths: readonly string[],\n): Promise<{ patch: string; changes: PlannedFileChange[] }> {\n const patches: string[] = [];\n const changes: PlannedFileChange[] = [];\n for (const path of paths) {\n assertPathPhysicallyContained(context, manifestDirectory, path);\n const before = context.fs.readFileSync(path, 'utf8');\n const result = await runner(\n 'deno',\n ['fmt', ...configArgs, `--ext=${denoExtension(path)}`, '-'],\n { cwd: manifestDirectory, input: before },\n context,\n );\n if (result.code !== 0) {\n throw new Error(\n `Deno could not preview formatting for ${relativePath(manifestDirectory, path)}.${\n result.stderr.trim() ? `\\n${result.stderr.trim()}` : ''\n }`,\n );\n }\n if (result.stdout !== before) {\n const display = relativePath(manifestDirectory, path);\n patches.push(\n createTwoFilesPatch(display, display, before, result.stdout, '', '', { context: 3 }),\n );\n changes.push({\n kind: 'file',\n path,\n before,\n after: result.stdout,\n description: `Format ${display}`,\n mode: context.fs.statSync(path).mode,\n });\n }\n }\n return { patch: patches.join('\\n'), changes };\n}\n\n/**\n * Record one Deno command failure.\n *\n * @param diagnostics - Result collection\n * @param code - Stable code\n * @param message - Summary\n * @param result - Captured process result\n */\nfunction recordDenoFailure(\n diagnostics: CustomFunctionDiagnostic[],\n code: string,\n message: string,\n result: CapturedProcessResult,\n): void {\n addError(diagnostics, {\n code,\n message: `${message}${result.stderr.trim() ? `\\n${result.stderr.trim()}` : ''}`,\n });\n}\n\n/**\n * Run credential-free local validation without executing user modules.\n *\n * @param context - CLI context\n * @param options - Manifest and format behavior\n * @param runner - Captured process runner\n * @returns Stable check result\n */\nexport async function runCustomFunctionChecks(\n context: LocalContext,\n options: RunCustomFunctionChecksOptions,\n runner: CapturedProcessRunner = runCapturedProcess,\n): Promise<CustomFunctionCheckResult> {\n const manifestPath = resolve(options.manifestPath);\n const manifestDirectory = dirname(manifestPath);\n const diagnostics: CustomFunctionDiagnostic[] = [];\n const statuses = new Map<string, CustomFunctionCheckStatus>([\n ['manifest', 'passed'],\n ['files', 'passed'],\n ['payloads', 'passed'],\n ['runtime', 'passed'],\n ['exports', 'passed'],\n ['typecheck', 'passed'],\n ['lint', 'passed'],\n ['format', 'passed'],\n ]);\n const buildResult = (): CustomFunctionCheckResult => ({\n version: CUSTOM_FUNCTION_RESULT_VERSION,\n status: diagnostics.some(({ severity }) => severity === 'error') ? 'failed' : 'passed',\n manifestPath,\n checks: [...statuses].map(([name, status]) => ({ name, status })),\n diagnostics,\n });\n if (!context.fs.existsSync(manifestPath)) {\n addError(diagnostics, {\n code: 'manifest.missing',\n message: 'Custom Function manifest does not exist.',\n path: relativePath(context.process.cwd(), manifestPath),\n });\n statuses.set('manifest', 'failed');\n ['files', 'payloads', 'runtime', 'exports', 'typecheck', 'lint', 'format'].forEach((name) =>\n statuses.set(name, 'skipped'),\n );\n return buildResult();\n }\n\n let entries: readonly CustomFunctionManifestEntry[] = [];\n try {\n const manifestContents = replaceVariablesInYaml(\n context.fs.readFileSync(manifestPath, 'utf8'),\n options.variables ?? {},\n );\n entries = parseCustomFunctionsManifest(manifestContents).functions;\n } catch (error) {\n addError(diagnostics, {\n code: 'manifest.invalid',\n message: (error as Error).message,\n path: relativePath(manifestDirectory, manifestPath),\n });\n statuses.set('manifest', 'failed');\n ['files', 'payloads', 'runtime', 'exports', 'typecheck', 'lint', 'format'].forEach((name) =>\n statuses.set(name, 'skipped'),\n );\n return buildResult();\n }\n entries.forEach((entry) => {\n try {\n validateCustomFunctionExecutionContext({\n ...(entry.env ? { env: entry.env } : {}),\n ...(entry['allowed-hosts'] ? { allowedHosts: entry['allowed-hosts'] } : {}),\n });\n } catch (error) {\n statuses.set('manifest', 'failed');\n addError(diagnostics, {\n code: 'manifest.execution-context',\n message: (error as Error).message,\n path: relativePath(manifestDirectory, manifestPath),\n functionName: entry.name,\n });\n }\n });\n\n const { sources, payloadPaths } = validateReferencedFiles(\n context,\n manifestDirectory,\n entries,\n diagnostics,\n );\n if (\n diagnostics.some(({ code }) =>\n ['source.', 'manifest.unresolved-code-path'].some((prefix) => code.startsWith(prefix)),\n )\n ) {\n statuses.set('files', 'failed');\n ['exports', 'typecheck', 'lint'].forEach((name) => statuses.set(name, 'failed'));\n }\n if (\n diagnostics.some(({ code }) =>\n ['payload.', 'manifest.unresolved-payload-path'].some((prefix) => code.startsWith(prefix)),\n )\n ) {\n statuses.set('payloads', 'failed');\n }\n\n const denoJsonc = join(manifestDirectory, 'deno.jsonc');\n const denoJson = join(manifestDirectory, 'deno.json');\n const configPath = context.fs.existsSync(denoJsonc)\n ? denoJsonc\n : context.fs.existsSync(denoJson)\n ? denoJson\n : undefined;\n const unsafeConfig =\n configPath !== undefined && !isPathPhysicallyContained(context, manifestDirectory, configPath);\n let unsafeConfiguration = unsafeConfig;\n let docImportMap: string | undefined;\n if (unsafeConfig) {\n addError(diagnostics, {\n code: 'deno.config-outside-project',\n message: 'Deno configuration resolves outside the manifest directory through a symlink.',\n path: relativePath(manifestDirectory, configPath),\n });\n ['exports', 'typecheck', 'lint', 'format'].forEach((name) => statuses.set(name, 'failed'));\n } else {\n try {\n docImportMap = resolveDocImportMap(context, manifestDirectory, configPath);\n } catch (error) {\n unsafeConfiguration = true;\n addError(diagnostics, {\n code: 'deno.import-map-outside-project',\n message: (error as Error).message,\n });\n ['exports', 'typecheck', 'lint', 'format'].forEach((name) => statuses.set(name, 'failed'));\n }\n }\n const configArgs =\n configPath && !unsafeConfiguration ? [`--config=${configPath}`] : ['--no-config'];\n const skipPendingDenoChecks = (): void => {\n ['exports', 'typecheck', 'lint', 'format'].forEach((name) => {\n if (statuses.get(name) !== 'failed') {\n statuses.set(name, 'skipped');\n }\n });\n };\n const denoVersion = await runner('deno', ['--version'], { cwd: manifestDirectory }, context);\n const compatibility =\n denoVersion.code === 0 ? getDenoRuntimeCompatibility(denoVersion.stdout) : undefined;\n if (compatibility?.level === 'warning') {\n diagnostics.push({\n code: 'deno.version-mismatch',\n severity: 'warning',\n message: compatibility.message,\n });\n }\n if (denoVersion.error?.code === 'ENOENT') {\n statuses.set('runtime', 'failed');\n skipPendingDenoChecks();\n addError(diagnostics, {\n code: 'deno.missing',\n message: `Deno ${SUPPORTED_DENO_MAJOR_VERSION}.x is required for export, type, lint, and format checks. Install it from ${DENO_INSTALL_URL}`,\n });\n } else if (denoVersion.code !== 0) {\n statuses.set('runtime', 'failed');\n skipPendingDenoChecks();\n recordDenoFailure(diagnostics, 'deno.unavailable', 'Deno could not be started.', denoVersion);\n } else if (compatibility?.level === 'error') {\n statuses.set('runtime', 'failed');\n skipPendingDenoChecks();\n addError(diagnostics, {\n code: 'deno.unsupported-version',\n message: compatibility.message,\n });\n } else if (!unsafeConfiguration) {\n for (const source of sources) {\n const moduleGraph = await runner(\n 'deno',\n ['info', '--json', ...configArgs, source.path],\n { cwd: manifestDirectory },\n context,\n );\n if (moduleGraph.code !== 0) {\n statuses.set('files', 'failed');\n recordDenoFailure(\n diagnostics,\n 'source.module-graph',\n `Could not inspect runtime imports for ${relativePath(manifestDirectory, source.path)}.`,\n moduleGraph,\n );\n } else {\n try {\n const unsupportedImports = findNonSelfContainedRuntimeImports(moduleGraph.stdout);\n if (unsupportedImports.length > 0) {\n statuses.set('files', 'failed');\n addError(diagnostics, {\n code: 'source.local-runtime-import',\n message:\n 'Custom Functions must be self-contained. Local or import-map runtime dependencies are not deployed: ' +\n unsupportedImports.join(', '),\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n } catch (error) {\n statuses.set('files', 'failed');\n addError(diagnostics, {\n code: 'source.module-graph',\n message: (error as Error).message,\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n }\n const result = await runner(\n 'deno',\n ['doc', '--json', ...(docImportMap ? ['--import-map', docImportMap] : []), source.path],\n { cwd: manifestDirectory },\n context,\n );\n if (result.code !== 0) {\n statuses.set('exports', 'failed');\n recordDenoFailure(\n diagnostics,\n 'exports.inspect',\n `Could not inspect exports for ${relativePath(manifestDirectory, source.path)}.`,\n result,\n );\n continue;\n }\n const names = exportedNames(result.stdout);\n if (source.needsDefault && !names.has('default')) {\n statuses.set('exports', 'failed');\n addError(diagnostics, {\n code: 'exports.default-missing',\n message: 'The manifest fixtures require a default export.',\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n if (source.needsEnricher && !names.has('enricher')) {\n statuses.set('exports', 'failed');\n addError(diagnostics, {\n code: 'exports.enricher-missing',\n message: 'A REQUEST_ENRICHER fixture requires an `enricher` export.',\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n if (source.needsAnyDsrExport && !names.has('default') && !names.has('enricher')) {\n statuses.set('exports', 'failed');\n addError(diagnostics, {\n code: 'exports.dsr-missing',\n message: 'A DSR Custom Function requires a `default` or `enricher` export.',\n path: relativePath(manifestDirectory, source.path),\n functionName: source.entry.name,\n });\n }\n }\n\n const sourcePaths = [...new Set(sources.map(({ path }) => path))];\n if (sourcePaths.length > 0) {\n const typecheck = await runner(\n 'deno',\n ['check', ...configArgs, ...sourcePaths],\n { cwd: manifestDirectory },\n context,\n );\n if (typecheck.code !== 0) {\n statuses.set('typecheck', 'failed');\n recordDenoFailure(diagnostics, 'deno.typecheck', 'Deno type checking failed.', typecheck);\n }\n const lint = await runner(\n 'deno',\n ['lint', ...configArgs, ...sourcePaths],\n { cwd: manifestDirectory },\n context,\n );\n if (lint.code !== 0) {\n statuses.set('lint', 'failed');\n recordDenoFailure(diagnostics, 'deno.lint', 'Deno linting failed.', lint);\n }\n }\n\n const formatPaths = [\n ...sourcePaths,\n ...payloadPaths,\n manifestPath,\n ...(configPath ? [configPath] : []),\n ...(docImportMap && docImportMap !== configPath && !/^[a-z][a-z\\d+.-]*:/iu.test(docImportMap)\n ? [docImportMap]\n : []),\n ];\n formatPaths.forEach((path) => assertPathPhysicallyContained(context, manifestDirectory, path));\n const format = await runner(\n 'deno',\n ['fmt', '--check', ...configArgs, ...formatPaths],\n { cwd: manifestDirectory },\n context,\n );\n if (format.code !== 0) {\n let formatPlan: Awaited<ReturnType<typeof buildFormatPlan>>;\n try {\n formatPlan = await buildFormatPlan(\n context,\n runner,\n manifestDirectory,\n configArgs,\n formatPaths,\n );\n } catch (error) {\n statuses.set('format', 'failed');\n addError(diagnostics, {\n code: 'deno.format-preview',\n message: (error as Error).message,\n });\n return buildResult();\n }\n if (formatPlan.changes.length === 0) {\n statuses.set('format', 'failed');\n recordDenoFailure(\n diagnostics,\n 'deno.format',\n 'Deno reported a formatting failure but did not produce a repair.',\n format,\n );\n return buildResult();\n }\n const shouldFix =\n options.fix ||\n (options.confirmFormat ? await options.confirmFormat(formatPlan.patch) : false);\n if (shouldFix) {\n try {\n await applyProjectPlan(context, {\n rootDirectory: manifestDirectory,\n changes: formatPlan.changes,\n });\n } catch (error) {\n statuses.set('format', 'failed');\n addError(diagnostics, {\n code: 'deno.format-fix',\n message: `Could not apply formatting transaction: ${(error as Error).message}`,\n });\n }\n } else {\n statuses.set('format', 'failed');\n formatPlan.changes.forEach((change, index) => {\n addError(diagnostics, {\n code: 'deno.format',\n message:\n 'Referenced file is not formatted.' +\n (index === 0 && options.includeFormatPatchInDiagnostics && formatPlan.patch\n ? `\\n${formatPlan.patch}`\n : ''),\n path: relativePath(manifestDirectory, change.path),\n });\n });\n }\n }\n }\n\n return buildResult();\n}\n","import colors from 'colors';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { formatMissingManifestMessage } from '../../../lib/custom-functions/missing-manifest.js';\nimport { resolveCustomFunctionProjectPaths } from '../../../lib/custom-functions/paths.js';\nimport { discoverCustomFunctionManifests } from '../../../lib/custom-functions/project-discovery.js';\nimport { parseVariablesFromString } from '../../../lib/helpers/parseVariablesFromString.js';\nimport {\n isInteractivePromptInvocation,\n PromptCancelledError,\n ScaffoldPrompts,\n} from '../../../lib/scaffolding/prompts.js';\nimport { runCustomFunctionChecks } from './helpers.js';\n\n/** CLI flags for `transcend custom-functions check`. */\nexport interface CustomFunctionsCheckFlags {\n /** Explicit manifest path. */\n manifest?: string;\n /** Manifest variable substitutions. */\n variables: string;\n /** Apply Deno formatting. */\n fix: boolean;\n /** Disable prompts. */\n noInteractive: boolean;\n /** Emit JSON on stdout. */\n json: boolean;\n}\n\n/**\n * Validate a local Custom Function project without credentials.\n *\n * @param this - CLI context\n * @param flags - Check and interaction flags\n * @param directory - Optional target directory\n */\nexport async function check(\n this: LocalContext,\n flags: CustomFunctionsCheckFlags,\n directory?: string,\n): Promise<void> {\n doneInputValidation(this.process);\n const { manifestPath } = resolveCustomFunctionProjectPaths(this.process.cwd(), {\n ...(directory ? { directory } : {}),\n ...(flags.manifest ? { manifest: flags.manifest } : {}),\n });\n const missingMessage = this.fs.existsSync(manifestPath)\n ? undefined\n : formatMissingManifestMessage({\n cwd: this.process.cwd(),\n manifestPath,\n discoveredManifestPaths: discoverCustomFunctionManifests(this, this.process.cwd()),\n command: 'check',\n });\n const interactive = isInteractivePromptInvocation(\n flags,\n this.process.stdin.isTTY,\n this.process.stderr.isTTY,\n );\n const prompts = new ScaffoldPrompts(this);\n try {\n const result = await runCustomFunctionChecks(this, {\n manifestPath,\n variables: parseVariablesFromString(flags.variables),\n fix: flags.fix,\n includeFormatPatchInDiagnostics: !flags.json,\n ...(interactive && !flags.fix\n ? {\n confirmFormat: async (patch: string): Promise<boolean> => {\n if (patch) {\n this.logger.error(patch);\n }\n return prompts.confirm('Format the files shown above?', true);\n },\n }\n : {}),\n });\n if (missingMessage) {\n result.diagnostics.forEach((diagnostic) => {\n if (diagnostic.code === 'manifest.missing') {\n diagnostic.message = missingMessage;\n }\n });\n }\n if (flags.json) {\n this.process.stdout.write(`${JSON.stringify(result)}\\n`);\n } else {\n this.logger.info(`${colors.bold('Custom Function checks')}\\n`);\n result.checks.forEach(({ name, status }) => {\n const label = status === 'passed' ? 'PASS' : status === 'failed' ? 'FAIL' : 'SKIP';\n const styledLabel =\n status === 'passed'\n ? colors.green(label)\n : status === 'failed'\n ? colors.red(label)\n : colors.yellow(label);\n this.logger.info(`${styledLabel} ${name[0]!.toUpperCase()}${name.slice(1)}`);\n });\n if (result.diagnostics.length > 0) {\n this.logger.error('');\n }\n result.diagnostics.forEach((diagnostic) => {\n const location = diagnostic.path ? `${diagnostic.path}: ` : '';\n const owner = diagnostic.functionName ? `[${diagnostic.functionName}] ` : '';\n const message = `${diagnostic.severity}: ${location}${owner}${diagnostic.message}`;\n if (diagnostic.severity === 'warning') {\n this.logger.warn(colors.yellow(message));\n } else {\n this.logger.error(colors.red(message));\n }\n });\n if (result.status === 'passed') {\n this.logger.info('');\n this.logger.info(colors.green('Custom Function checks passed.'));\n } else {\n this.logger.error('');\n this.logger.error(colors.red('Custom Function checks failed.'));\n }\n }\n if (result.status === 'failed') {\n this.process.exitCode = 1;\n }\n } catch (error) {\n if (error instanceof PromptCancelledError) {\n this.process.exit(130);\n }\n throw error;\n }\n}\n"],"mappings":"sjCAuFA,SAAS,EACP,EACA,EACM,CACN,EAAY,KAAK,CAAE,SAAU,QAAS,GAAG,EAAY,CAAC,CAUxD,SAAS,EAAa,EAA2B,EAAsB,CAErE,OADc,EAAS,EAAmB,EAAK,CAAC,MAAM,EAAI,CAAC,KAAK,IACpD,EAAI,IASlB,SAAS,EAAkB,EAAwD,CACjF,IAAM,EACJ,GAEI,EAAM,OAAS,MAGZ,IAAgB,mBAAqB,eAAiB,gBAFpD,UAaX,OATI,EAAM,gBACD,CACL,CACE,QACA,KAAM,EAAM,gBACZ,KAAM,EAAQ,EAAM,qBAAqB,CAC1C,CACF,EAEK,EAAM,kBAAoB,EAAE,EAAE,IAAK,IAAU,CACnD,QACA,KAAM,EAAK,QACX,KAAM,EAAQ,EAAK,gBAAgB,CACpC,EAAE,CAUL,SAAS,EACP,EACA,EACiB,CACjB,IAAM,EAAe,EAAkB,EAAM,CAAC,KAAK,CAAE,UAAW,EAAK,CAC/D,EAAqB,EAAM,OAAS,OAAS,EAAa,SAAW,EAC3E,MAAO,CACL,QACA,KAAM,EAAQ,EAAmB,EAAM,KAAK,CAC5C,aAAc,EAAM,OAAS,OAAS,EAAa,SAAS,gBAAgB,CAC5E,cAAe,EAAa,SAAS,eAAe,CACpD,kBAAmB,EACpB,CAQH,SAAS,GAA6E,CACpF,IAAM,EAAM,IAAI,EAAI,CAAE,UAAW,GAAM,OAAQ,GAAO,CAAC,CACvD,MAAO,CACL,QAAS,EAAI,QAAQ,EAAuC,CAC5D,gBAAiB,EAAI,QAAQ,EAA6C,CAC1E,eAAgB,EAAI,QAAQ,EAAoD,CACjF,CASH,SAAS,EAAkB,EAA4B,CACrD,MAAO,GAAG,EAAM,cAAgB,IAAI,GAAG,EAAM,SAAW,eAY1D,SAAS,EACP,EACA,EACA,EACA,EAMA,CACA,IAAM,EAAa,GAAwB,CACrC,EAA6B,EAAE,CAC/B,EAAyB,EAAE,CAsGjC,OArGA,EAAQ,QAAS,GAAU,CACzB,GAAI,yBAAyB,KAAK,EAAM,KAAK,CAC3C,EAAS,EAAa,CACpB,KAAM,gCACN,QAAS,+DACT,KAAM,EAAM,KACZ,aAAc,EAAM,KACrB,CAAC,SACO,EAAsC,EAAM,KAAK,CAAE,CAC5D,IAAM,EAAS,EAAgB,EAAO,EAAkB,CACnD,EAAQ,GAAG,WAAW,EAAO,KAAK,CAO3B,EAA0B,EAAS,EAAmB,EAAO,KAAK,CAOlE,EAAQ,GAAG,SAAS,EAAO,KAAK,CAAC,QAAQ,CAQnD,EAAQ,KAAK,EAAO,CAPpB,EAAS,EAAa,CACpB,KAAM,kBACN,QAAS,gDACT,KAAM,EAAM,KACZ,aAAc,EAAM,KACrB,CAAC,CAZF,EAAS,EAAa,CACpB,KAAM,yBACN,QAAS,+EACT,KAAM,EAAM,KACZ,aAAc,EAAM,KACrB,CAAC,CAZF,EAAS,EAAa,CACpB,KAAM,iBACN,QAAS,yCACT,KAAM,EAAM,KACZ,aAAc,EAAM,KACrB,CAAC,CAoBN,EAAkB,EAAM,CAAC,QAAS,GAAc,CAC9C,GAAI,yBAAyB,KAAK,EAAU,KAAK,CAAE,CACjD,EAAS,EAAa,CACpB,KAAM,mCACN,QAAS,kEACT,KAAM,EAAU,KAChB,aAAc,EAAM,KACrB,CAAC,CACF,OAEF,IAAM,EAAc,EAAQ,EAAmB,EAAU,KAAK,CAC9D,GAAI,CAAC,EAAQ,GAAG,WAAW,EAAY,CAAE,CACvC,EAAS,EAAa,CACpB,KAAM,kBACN,QAAS,0CACT,KAAM,EAAU,KAChB,aAAc,EAAM,KACrB,CAAC,CACF,OAEF,GAAI,CAAC,EAA0B,EAAS,EAAmB,EAAY,CAAE,CACvE,EAAS,EAAa,CACpB,KAAM,0BACN,QACE,qFACF,KAAM,EAAU,KAChB,aAAc,EAAM,KACrB,CAAC,CACF,OAEF,GAAI,CAAC,EAAQ,GAAG,SAAS,EAAY,CAAC,QAAQ,CAAE,CAC9C,EAAS,EAAa,CACpB,KAAM,mBACN,QAAS,iDACT,KAAM,EAAU,KAChB,aAAc,EAAM,KACrB,CAAC,CACF,OAEF,EAAa,KAAK,EAAY,CAC9B,IAAI,EACJ,GAAI,CACF,EAAU,KAAK,MAAM,EAAQ,GAAG,aAAa,EAAa,OAAO,CAAC,OAC3D,EAAO,CACd,EAAS,EAAa,CACpB,KAAM,uBACN,QAAS,iBAAkB,EAAgB,UAC3C,KAAM,EAAU,KAChB,aAAc,EAAM,KACrB,CAAC,CACF,OAEF,IAAM,EAAW,EAAW,EAAU,MACjC,EAAS,EAAQ,GACnB,EAAS,QAAU,EAAE,EAAE,QAAS,GAC/B,EAAS,EAAa,CACpB,KAAM,iBACN,QAAS,EAAkB,EAAM,CACjC,KAAM,EAAU,KAChB,aAAc,EAAM,KACrB,CAAC,CACH,EAEH,EACF,CACK,CACL,UACA,aAAc,CAAC,GAAG,IAAI,IAAI,EAAa,CAAC,CACzC,CASH,SAAS,EAAc,EAA6B,CAClD,GAAI,CACF,IAAM,EAAW,KAAK,MAAM,EAAO,CAC7B,EAAQ,MAAM,QAAQ,EAAS,CACjC,EACA,GACE,OAAO,GAAa,UACpB,MAAM,QAAS,EAAqC,MAAM,CACxD,EAAqC,MACvC,IAAA,GAIN,OAHK,EAGE,IAAI,IACT,EAAM,QAAS,GAAS,CACtB,GAAI,CAAC,GAAQ,OAAO,GAAS,SAC3B,MAAO,EAAE,CAEX,IAAM,EAAQ,EAAiC,KAC/C,OAAO,OAAO,GAAS,SAAW,CAAC,EAAK,CAAG,EAAE,EAC7C,CACH,CAVQ,IAAI,SAWP,CACN,OAAO,IAAI,KAUf,SAAS,EAAc,EAAsB,CAC3C,OAAQ,EAAQ,EAAK,CAArB,CACE,IAAK,MACL,IAAK,OACH,MAAO,KACT,IAAK,QACL,IAAK,SACH,MAAO,OACT,IAAK,QACL,IAAK,OACH,MAAO,OACT,QACE,MAAO,MAiBb,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,CAAC,EACH,OAEF,IAAM,EAASA,EAAW,EAAQ,GAAG,aAAa,EAAY,OAAO,CAAC,CAQtE,GAAI,OAAO,GAAQ,WAAc,SAAU,CACzC,GAAI,uBAAuB,KAAK,EAAO,UAAU,CAC/C,OAAO,EAAO,UAEhB,IAAM,EAAgB,EAAQ,EAAQ,EAAW,CAAE,EAAO,UAAU,CAEpE,OADA,EAA8B,EAAS,EAAmB,EAAc,CACjE,EAET,IAAM,EAKF,EAAE,CACN,GAAI,EAAO,UAAY,IAAA,KACrB,EAAU,QAAU,EAAO,SAEzB,EAAO,SAAW,IAAA,KACpB,EAAU,OAAS,EAAO,QAExB,OAAO,KAAK,EAAU,CAAC,SAAW,EAGtC,MAAO,yBAAyB,mBAAmB,KAAK,UAAU,EAAU,CAAC,GAa/E,eAAe,EACb,EACA,EACA,EACA,EACA,EAC0D,CAC1D,IAAM,EAAoB,EAAE,CACtB,EAA+B,EAAE,CACvC,IAAK,IAAM,KAAQ,EAAO,CACxB,EAA8B,EAAS,EAAmB,EAAK,CAC/D,IAAM,EAAS,EAAQ,GAAG,aAAa,EAAM,OAAO,CAC9C,EAAS,MAAM,EACnB,OACA,CAAC,MAAO,GAAG,EAAY,SAAS,EAAc,EAAK,GAAI,IAAI,CAC3D,CAAE,IAAK,EAAmB,MAAO,EAAQ,CACzC,EACD,CACD,GAAI,EAAO,OAAS,EAClB,MAAU,MACR,yCAAyC,EAAa,EAAmB,EAAK,CAAC,GAC7E,EAAO,OAAO,MAAM,CAAG,KAAK,EAAO,OAAO,MAAM,GAAK,KAExD,CAEH,GAAI,EAAO,SAAW,EAAQ,CAC5B,IAAM,EAAU,EAAa,EAAmB,EAAK,CACrD,EAAQ,KACN,EAAoB,EAAS,EAAS,EAAQ,EAAO,OAAQ,GAAI,GAAI,CAAE,QAAS,EAAG,CAAC,CACrF,CACD,EAAQ,KAAK,CACX,KAAM,OACN,OACA,SACA,MAAO,EAAO,OACd,YAAa,UAAU,IACvB,KAAM,EAAQ,GAAG,SAAS,EAAK,CAAC,KACjC,CAAC,EAGN,MAAO,CAAE,MAAO,EAAQ,KAAK;EAAK,CAAE,UAAS,CAW/C,SAAS,EACP,EACA,EACA,EACA,EACM,CACN,EAAS,EAAa,CACpB,OACA,QAAS,GAAG,IAAU,EAAO,OAAO,MAAM,CAAG,KAAK,EAAO,OAAO,MAAM,GAAK,KAC5E,CAAC,CAWJ,eAAsB,EACpB,EACA,EACA,EAAgC,EACI,CACpC,IAAM,EAAe,EAAQ,EAAQ,aAAa,CAC5C,EAAoB,EAAQ,EAAa,CACzC,EAA0C,EAAE,CAC5C,EAAW,IAAI,IAAuC,CAC1D,CAAC,WAAY,SAAS,CACtB,CAAC,QAAS,SAAS,CACnB,CAAC,WAAY,SAAS,CACtB,CAAC,UAAW,SAAS,CACrB,CAAC,UAAW,SAAS,CACrB,CAAC,YAAa,SAAS,CACvB,CAAC,OAAQ,SAAS,CAClB,CAAC,SAAU,SAAS,CACrB,CAAC,CACI,OAAgD,CACpD,QAAA,EACA,OAAQ,EAAY,MAAM,CAAE,cAAe,IAAa,QAAQ,CAAG,SAAW,SAC9E,eACA,OAAQ,CAAC,GAAG,EAAS,CAAC,KAAK,CAAC,EAAM,MAAa,CAAE,OAAM,SAAQ,EAAE,CACjE,cACD,EACD,GAAI,CAAC,EAAQ,GAAG,WAAW,EAAa,CAUtC,OATA,EAAS,EAAa,CACpB,KAAM,mBACN,QAAS,2CACT,KAAM,EAAa,EAAQ,QAAQ,KAAK,CAAE,EAAa,CACxD,CAAC,CACF,EAAS,IAAI,WAAY,SAAS,CAClC,CAAC,QAAS,WAAY,UAAW,UAAW,YAAa,OAAQ,SAAS,CAAC,QAAS,GAClF,EAAS,IAAI,EAAM,UAAU,CAC9B,CACM,GAAa,CAGtB,IAAI,EAAkD,EAAE,CACxD,GAAI,CAKF,EAAU,EAJe,EACvB,EAAQ,GAAG,aAAa,EAAc,OAAO,CAC7C,EAAQ,WAAa,EAAE,CAE8B,CAAC,CAAC,gBAClD,EAAO,CAUd,OATA,EAAS,EAAa,CACpB,KAAM,mBACN,QAAU,EAAgB,QAC1B,KAAM,EAAa,EAAmB,EAAa,CACpD,CAAC,CACF,EAAS,IAAI,WAAY,SAAS,CAClC,CAAC,QAAS,WAAY,UAAW,UAAW,YAAa,OAAQ,SAAS,CAAC,QAAS,GAClF,EAAS,IAAI,EAAM,UAAU,CAC9B,CACM,GAAa,CAEtB,EAAQ,QAAS,GAAU,CACzB,GAAI,CACF,EAAuC,CACrC,GAAI,EAAM,IAAM,CAAE,IAAK,EAAM,IAAK,CAAG,EAAE,CACvC,GAAI,EAAM,iBAAmB,CAAE,aAAc,EAAM,iBAAkB,CAAG,EAAE,CAC3E,CAAC,OACK,EAAO,CACd,EAAS,IAAI,WAAY,SAAS,CAClC,EAAS,EAAa,CACpB,KAAM,6BACN,QAAU,EAAgB,QAC1B,KAAM,EAAa,EAAmB,EAAa,CACnD,aAAc,EAAM,KACrB,CAAC,GAEJ,CAEF,GAAM,CAAE,UAAS,gBAAiB,EAChC,EACA,EACA,EACA,EACD,CAEC,EAAY,MAAM,CAAE,UAClB,CAAC,UAAW,gCAAgC,CAAC,KAAM,GAAW,EAAK,WAAW,EAAO,CAAC,CACvF,GAED,EAAS,IAAI,QAAS,SAAS,CAC/B,CAAC,UAAW,YAAa,OAAO,CAAC,QAAS,GAAS,EAAS,IAAI,EAAM,SAAS,CAAC,EAGhF,EAAY,MAAM,CAAE,UAClB,CAAC,WAAY,mCAAmC,CAAC,KAAM,GAAW,EAAK,WAAW,EAAO,CAAC,CAC3F,EAED,EAAS,IAAI,WAAY,SAAS,CAGpC,IAAM,EAAY,EAAK,EAAmB,aAAa,CACjD,EAAW,EAAK,EAAmB,YAAY,CAC/C,EAAa,EAAQ,GAAG,WAAW,EAAU,CAC/C,EACA,EAAQ,GAAG,WAAW,EAAS,CAC7B,EACA,IAAA,GACA,EACJ,IAAe,IAAA,IAAa,CAAC,EAA0B,EAAS,EAAmB,EAAW,CAC5F,EAAsB,EACtB,EACJ,GAAI,EACF,EAAS,EAAa,CACpB,KAAM,8BACN,QAAS,gFACT,KAAM,EAAa,EAAmB,EAAW,CAClD,CAAC,CACF,CAAC,UAAW,YAAa,OAAQ,SAAS,CAAC,QAAS,GAAS,EAAS,IAAI,EAAM,SAAS,CAAC,MAE1F,GAAI,CACF,EAAe,EAAoB,EAAS,EAAmB,EAAW,OACnE,EAAO,CACd,EAAsB,GACtB,EAAS,EAAa,CACpB,KAAM,kCACN,QAAU,EAAgB,QAC3B,CAAC,CACF,CAAC,UAAW,YAAa,OAAQ,SAAS,CAAC,QAAS,GAAS,EAAS,IAAI,EAAM,SAAS,CAAC,CAG9F,IAAM,EACJ,GAAc,CAAC,EAAsB,CAAC,YAAY,IAAa,CAAG,CAAC,cAAc,CAC7E,MAAoC,CACxC,CAAC,UAAW,YAAa,OAAQ,SAAS,CAAC,QAAS,GAAS,CACvD,EAAS,IAAI,EAAK,GAAK,UACzB,EAAS,IAAI,EAAM,UAAU,EAE/B,EAEE,EAAc,MAAM,EAAO,OAAQ,CAAC,YAAY,CAAE,CAAE,IAAK,EAAmB,CAAE,EAAQ,CACtF,EACJ,EAAY,OAAS,EAAI,EAA4B,EAAY,OAAO,CAAG,IAAA,GAQ7E,GAPI,GAAe,QAAU,WAC3B,EAAY,KAAK,CACf,KAAM,wBACN,SAAU,UACV,QAAS,EAAc,QACxB,CAAC,CAEA,EAAY,OAAO,OAAS,SAC9B,EAAS,IAAI,UAAW,SAAS,CACjC,GAAuB,CACvB,EAAS,EAAa,CACpB,KAAM,eACN,QAAS,mFAAiH,IAC3H,CAAC,SACO,EAAY,OAAS,EAC9B,EAAS,IAAI,UAAW,SAAS,CACjC,GAAuB,CACvB,EAAkB,EAAa,mBAAoB,6BAA8B,EAAY,SACpF,GAAe,QAAU,QAClC,EAAS,IAAI,UAAW,SAAS,CACjC,GAAuB,CACvB,EAAS,EAAa,CACpB,KAAM,2BACN,QAAS,EAAc,QACxB,CAAC,SACO,CAAC,EAAqB,CAC/B,IAAK,IAAM,KAAU,EAAS,CAC5B,IAAM,EAAc,MAAM,EACxB,OACA,CAAC,OAAQ,SAAU,GAAG,EAAY,EAAO,KAAK,CAC9C,CAAE,IAAK,EAAmB,CAC1B,EACD,CACD,GAAI,EAAY,OAAS,EACvB,EAAS,IAAI,QAAS,SAAS,CAC/B,EACE,EACA,sBACA,yCAAyC,EAAa,EAAmB,EAAO,KAAK,CAAC,GACtF,EACD,MAED,GAAI,CACF,IAAM,EAAqB,EAAmC,EAAY,OAAO,CAC7E,EAAmB,OAAS,IAC9B,EAAS,IAAI,QAAS,SAAS,CAC/B,EAAS,EAAa,CACpB,KAAM,8BACN,QACE,uGACA,EAAmB,KAAK,KAAK,CAC/B,KAAM,EAAa,EAAmB,EAAO,KAAK,CAClD,aAAc,EAAO,MAAM,KAC5B,CAAC,QAEG,EAAO,CACd,EAAS,IAAI,QAAS,SAAS,CAC/B,EAAS,EAAa,CACpB,KAAM,sBACN,QAAU,EAAgB,QAC1B,KAAM,EAAa,EAAmB,EAAO,KAAK,CAClD,aAAc,EAAO,MAAM,KAC5B,CAAC,CAGN,IAAM,EAAS,MAAM,EACnB,OACA,CAAC,MAAO,SAAU,GAAI,EAAe,CAAC,eAAgB,EAAa,CAAG,EAAE,CAAG,EAAO,KAAK,CACvF,CAAE,IAAK,EAAmB,CAC1B,EACD,CACD,GAAI,EAAO,OAAS,EAAG,CACrB,EAAS,IAAI,UAAW,SAAS,CACjC,EACE,EACA,kBACA,iCAAiC,EAAa,EAAmB,EAAO,KAAK,CAAC,GAC9E,EACD,CACD,SAEF,IAAM,EAAQ,EAAc,EAAO,OAAO,CACtC,EAAO,cAAgB,CAAC,EAAM,IAAI,UAAU,GAC9C,EAAS,IAAI,UAAW,SAAS,CACjC,EAAS,EAAa,CACpB,KAAM,0BACN,QAAS,kDACT,KAAM,EAAa,EAAmB,EAAO,KAAK,CAClD,aAAc,EAAO,MAAM,KAC5B,CAAC,EAEA,EAAO,eAAiB,CAAC,EAAM,IAAI,WAAW,GAChD,EAAS,IAAI,UAAW,SAAS,CACjC,EAAS,EAAa,CACpB,KAAM,2BACN,QAAS,4DACT,KAAM,EAAa,EAAmB,EAAO,KAAK,CAClD,aAAc,EAAO,MAAM,KAC5B,CAAC,EAEA,EAAO,mBAAqB,CAAC,EAAM,IAAI,UAAU,EAAI,CAAC,EAAM,IAAI,WAAW,GAC7E,EAAS,IAAI,UAAW,SAAS,CACjC,EAAS,EAAa,CACpB,KAAM,sBACN,QAAS,mEACT,KAAM,EAAa,EAAmB,EAAO,KAAK,CAClD,aAAc,EAAO,MAAM,KAC5B,CAAC,EAIN,IAAM,EAAc,CAAC,GAAG,IAAI,IAAI,EAAQ,KAAK,CAAE,UAAW,EAAK,CAAC,CAAC,CACjE,GAAI,EAAY,OAAS,EAAG,CAC1B,IAAM,EAAY,MAAM,EACtB,OACA,CAAC,QAAS,GAAG,EAAY,GAAG,EAAY,CACxC,CAAE,IAAK,EAAmB,CAC1B,EACD,CACG,EAAU,OAAS,IACrB,EAAS,IAAI,YAAa,SAAS,CACnC,EAAkB,EAAa,iBAAkB,6BAA8B,EAAU,EAE3F,IAAM,EAAO,MAAM,EACjB,OACA,CAAC,OAAQ,GAAG,EAAY,GAAG,EAAY,CACvC,CAAE,IAAK,EAAmB,CAC1B,EACD,CACG,EAAK,OAAS,IAChB,EAAS,IAAI,OAAQ,SAAS,CAC9B,EAAkB,EAAa,YAAa,uBAAwB,EAAK,EAI7E,IAAM,EAAc,CAClB,GAAG,EACH,GAAG,EACH,EACA,GAAI,EAAa,CAAC,EAAW,CAAG,EAAE,CAClC,GAAI,GAAgB,IAAiB,GAAc,CAAC,uBAAuB,KAAK,EAAa,CACzF,CAAC,EAAa,CACd,EAAE,CACP,CACD,EAAY,QAAS,GAAS,EAA8B,EAAS,EAAmB,EAAK,CAAC,CAC9F,IAAM,EAAS,MAAM,EACnB,OACA,CAAC,MAAO,UAAW,GAAG,EAAY,GAAG,EAAY,CACjD,CAAE,IAAK,EAAmB,CAC1B,EACD,CACD,GAAI,EAAO,OAAS,EAAG,CACrB,IAAI,EACJ,GAAI,CACF,EAAa,MAAM,EACjB,EACA,EACA,EACA,EACA,EACD,OACM,EAAO,CAMd,OALA,EAAS,IAAI,SAAU,SAAS,CAChC,EAAS,EAAa,CACpB,KAAM,sBACN,QAAU,EAAgB,QAC3B,CAAC,CACK,GAAa,CAEtB,GAAI,EAAW,QAAQ,SAAW,EAQhC,OAPA,EAAS,IAAI,SAAU,SAAS,CAChC,EACE,EACA,cACA,mEACA,EACD,CACM,GAAa,CAKtB,GAFE,EAAQ,KACP,EAAQ,eAAgB,MAAM,EAAQ,cAAc,EAAW,MAAM,CAEtE,GAAI,CACF,MAAM,EAAiB,EAAS,CAC9B,cAAe,EACf,QAAS,EAAW,QACrB,CAAC,OACK,EAAO,CACd,EAAS,IAAI,SAAU,SAAS,CAChC,EAAS,EAAa,CACpB,KAAM,kBACN,QAAS,2CAA4C,EAAgB,UACtE,CAAC,MAGJ,EAAS,IAAI,SAAU,SAAS,CAChC,EAAW,QAAQ,SAAS,EAAQ,IAAU,CAC5C,EAAS,EAAa,CACpB,KAAM,cACN,QACE,qCACC,IAAU,GAAK,EAAQ,iCAAmC,EAAW,MAClE,KAAK,EAAW,QAChB,IACN,KAAM,EAAa,EAAmB,EAAO,KAAK,CACnD,CAAC,EACF,EAKR,OAAO,GAAa,CClzBtB,eAAsB,EAEpB,EACA,EACe,CACf,EAAoB,KAAK,QAAQ,CACjC,GAAM,CAAE,gBAAiB,EAAkC,KAAK,QAAQ,KAAK,CAAE,CAC7E,GAAI,EAAY,CAAE,YAAW,CAAG,EAAE,CAClC,GAAI,EAAM,SAAW,CAAE,SAAU,EAAM,SAAU,CAAG,EAAE,CACvD,CAAC,CACI,EAAiB,KAAK,GAAG,WAAW,EAAa,CACnD,IAAA,GACA,EAA6B,CAC3B,IAAK,KAAK,QAAQ,KAAK,CACvB,eACA,wBAAyB,EAAgC,KAAM,KAAK,QAAQ,KAAK,CAAC,CAClF,QAAS,QACV,CAAC,CACA,EAAc,EAClB,EACA,KAAK,QAAQ,MAAM,MACnB,KAAK,QAAQ,OAAO,MACrB,CACK,EAAU,IAAI,EAAgB,KAAK,CACzC,GAAI,CACF,IAAM,EAAS,MAAM,EAAwB,KAAM,CACjD,eACA,UAAW,EAAyB,EAAM,UAAU,CACpD,IAAK,EAAM,IACX,gCAAiC,CAAC,EAAM,KACxC,GAAI,GAAe,CAAC,EAAM,IACtB,CACE,cAAe,KAAO,KAChB,GACF,KAAK,OAAO,MAAM,EAAM,CAEnB,EAAQ,QAAQ,gCAAiC,GAAK,EAEhE,CACD,EAAE,CACP,CAAC,CACE,GACF,EAAO,YAAY,QAAS,GAAe,CACrC,EAAW,OAAS,qBACtB,EAAW,QAAU,IAEvB,CAEA,EAAM,KACR,KAAK,QAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAO,CAAC,IAAI,EAExD,KAAK,OAAO,KAAK,GAAG,EAAO,KAAK,yBAAyB,CAAC,IAAI,CAC9D,EAAO,OAAO,SAAS,CAAE,OAAM,YAAa,CAC1C,IAAM,EAAQ,IAAW,SAAW,OAAS,IAAW,SAAW,OAAS,OACtE,EACJ,IAAW,SACP,EAAO,MAAM,EAAM,CACnB,IAAW,SACT,EAAO,IAAI,EAAM,CACjB,EAAO,OAAO,EAAM,CAC5B,KAAK,OAAO,KAAK,GAAG,EAAY,GAAG,EAAK,GAAI,aAAa,GAAG,EAAK,MAAM,EAAE,GAAG,EAC5E,CACE,EAAO,YAAY,OAAS,GAC9B,KAAK,OAAO,MAAM,GAAG,CAEvB,EAAO,YAAY,QAAS,GAAe,CACzC,IAAM,EAAW,EAAW,KAAO,GAAG,EAAW,KAAK,IAAM,GACtD,EAAQ,EAAW,aAAe,IAAI,EAAW,aAAa,IAAM,GACpE,EAAU,GAAG,EAAW,SAAS,IAAI,IAAW,IAAQ,EAAW,UACrE,EAAW,WAAa,UAC1B,KAAK,OAAO,KAAK,EAAO,OAAO,EAAQ,CAAC,CAExC,KAAK,OAAO,MAAM,EAAO,IAAI,EAAQ,CAAC,EAExC,CACE,EAAO,SAAW,UACpB,KAAK,OAAO,KAAK,GAAG,CACpB,KAAK,OAAO,KAAK,EAAO,MAAM,iCAAiC,CAAC,GAEhE,KAAK,OAAO,MAAM,GAAG,CACrB,KAAK,OAAO,MAAM,EAAO,IAAI,iCAAiC,CAAC,GAG/D,EAAO,SAAW,WACpB,KAAK,QAAQ,SAAW,SAEnB,EAAO,CAId,MAHI,aAAiB,GACnB,KAAK,QAAQ,KAAK,IAAI,CAElB"}