@transcend-io/cli 12.0.0 → 12.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -149
- package/dist/{app-CR3U95JW.mjs → app-CfJlhIn8.mjs} +18 -18
- package/dist/app-CfJlhIn8.mjs.map +1 -0
- package/dist/{approvePrivacyRequests-BDG82nlp.mjs → approvePrivacyRequests-BWj6SsgX.mjs} +2 -2
- package/dist/{approvePrivacyRequests-BDG82nlp.mjs.map → approvePrivacyRequests-BWj6SsgX.mjs.map} +1 -1
- package/dist/bin/bash-complete.mjs +1 -1
- package/dist/bin/cli.mjs +1 -1
- package/dist/bin/deprecated-command.mjs +1 -1
- package/dist/buildExamples-1I3xKR1X.mjs +2 -0
- package/dist/buildExamples-1I3xKR1X.mjs.map +1 -0
- package/dist/{buildXdiSyncEndpoint-FExEagKc.mjs → buildXdiSyncEndpoint-CAal3Xc4.mjs} +2 -2
- package/dist/{buildXdiSyncEndpoint-FExEagKc.mjs.map → buildXdiSyncEndpoint-CAal3Xc4.mjs.map} +1 -1
- package/dist/{bulkRestartRequests-OKwKXc52.mjs → bulkRestartRequests-B3wupylo.mjs} +2 -2
- package/dist/{bulkRestartRequests-OKwKXc52.mjs.map → bulkRestartRequests-B3wupylo.mjs.map} +1 -1
- package/dist/{bulkRetryEnrichers-Dl-n8AFF.mjs → bulkRetryEnrichers-D801tBcB.mjs} +2 -2
- package/dist/{bulkRetryEnrichers-Dl-n8AFF.mjs.map → bulkRetryEnrichers-D801tBcB.mjs.map} +1 -1
- package/dist/{cancelPrivacyRequests-BIgX5SDz.mjs → cancelPrivacyRequests-CAKTZF47.mjs} +2 -2
- package/dist/{cancelPrivacyRequests-BIgX5SDz.mjs.map → cancelPrivacyRequests-CAKTZF47.mjs.map} +1 -1
- package/dist/{command-X7lkPELf.mjs → command-BDQOL_MQ.mjs} +2 -2
- package/dist/{command-X7lkPELf.mjs.map → command-BDQOL_MQ.mjs.map} +1 -1
- package/dist/{constants-BRsj50Nb.mjs → constants-BlKpAm3R.mjs} +2 -2
- package/dist/{constants-BRsj50Nb.mjs.map → constants-BlKpAm3R.mjs.map} +1 -1
- package/dist/{createPoolingCommandUi-CyPZ3GqN.mjs → createPoolingCommandUi-JBOW5UxY.mjs} +2 -2
- package/dist/{createPoolingCommandUi-CyPZ3GqN.mjs.map → createPoolingCommandUi-JBOW5UxY.mjs.map} +1 -1
- package/dist/{downloadPrivacyRequestFiles-EBySRnvd.mjs → downloadPrivacyRequestFiles-Cf14MQR4.mjs} +2 -2
- package/dist/{downloadPrivacyRequestFiles-EBySRnvd.mjs.map → downloadPrivacyRequestFiles-Cf14MQR4.mjs.map} +1 -1
- package/dist/{generateCrossAccountApiKeys-pWTrIUE6.mjs → generateCrossAccountApiKeys-CVdsJFOe.mjs} +2 -2
- package/dist/{generateCrossAccountApiKeys-pWTrIUE6.mjs.map → generateCrossAccountApiKeys-CVdsJFOe.mjs.map} +1 -1
- package/dist/{impl-1SsreZWo.mjs → impl-2sYR_UFO.mjs} +2 -2
- package/dist/{impl-1SsreZWo.mjs.map → impl-2sYR_UFO.mjs.map} +1 -1
- package/dist/impl-B-Oe7DcE2.mjs +421 -0
- package/dist/{impl-DQcgEx7V2.mjs.map → impl-B-Oe7DcE2.mjs.map} +1 -1
- package/dist/{impl-CspH2ZWx.mjs → impl-BD03bzB-.mjs} +2 -2
- package/dist/{impl-CspH2ZWx.mjs.map → impl-BD03bzB-.mjs.map} +1 -1
- package/dist/{impl-CrdqsTUy.mjs → impl-BGtup1F9.mjs} +2 -2
- package/dist/{impl-CrdqsTUy.mjs.map → impl-BGtup1F9.mjs.map} +1 -1
- package/dist/impl-BQRP9NIv.mjs +2 -0
- package/dist/impl-BQRP9NIv.mjs.map +1 -0
- package/dist/{impl-CWP6AXSb.mjs → impl-BQe6vddz.mjs} +2 -2
- package/dist/{impl-CWP6AXSb.mjs.map → impl-BQe6vddz.mjs.map} +1 -1
- package/dist/{impl-B440iuvL.mjs → impl-BQj1Ien4.mjs} +3 -3
- package/dist/{impl-B440iuvL.mjs.map → impl-BQj1Ien4.mjs.map} +1 -1
- package/dist/{impl-CU38kdj8.mjs → impl-BRFL8xp7.mjs} +2 -2
- package/dist/{impl-CU38kdj8.mjs.map → impl-BRFL8xp7.mjs.map} +1 -1
- package/dist/{impl-eeS2lVi5.mjs → impl-BTvZxws5.mjs} +2 -2
- package/dist/{impl-eeS2lVi5.mjs.map → impl-BTvZxws5.mjs.map} +1 -1
- package/dist/{impl-D1UogVAq.mjs → impl-BVcy_GYa.mjs} +2 -2
- package/dist/{impl-D1UogVAq.mjs.map → impl-BVcy_GYa.mjs.map} +1 -1
- package/dist/{impl-vmLq6HCI.mjs → impl-B_CRtRo8.mjs} +2 -2
- package/dist/{impl-vmLq6HCI.mjs.map → impl-B_CRtRo8.mjs.map} +1 -1
- package/dist/{impl-7rdGuHOC.mjs → impl-BgD7TeMD.mjs} +2 -2
- package/dist/{impl-7rdGuHOC.mjs.map → impl-BgD7TeMD.mjs.map} +1 -1
- package/dist/{impl-BdTxFv63.mjs → impl-BgkovGOz.mjs} +2 -2
- package/dist/{impl-BdTxFv63.mjs.map → impl-BgkovGOz.mjs.map} +1 -1
- package/dist/{impl-Do2TNA3-.mjs → impl-Bh02zrTq.mjs} +2 -2
- package/dist/{impl-Do2TNA3-.mjs.map → impl-Bh02zrTq.mjs.map} +1 -1
- package/dist/{impl-HUfaARep.mjs → impl-BopWGXnH.mjs} +2 -2
- package/dist/{impl-HUfaARep.mjs.map → impl-BopWGXnH.mjs.map} +1 -1
- package/dist/{impl-iD6Fknfe.mjs → impl-BxvKe9_7.mjs} +2 -2
- package/dist/{impl-iD6Fknfe.mjs.map → impl-BxvKe9_7.mjs.map} +1 -1
- package/dist/{impl-DtnYcktN.mjs → impl-BzIyVAg_.mjs} +2 -2
- package/dist/{impl-DtnYcktN.mjs.map → impl-BzIyVAg_.mjs.map} +1 -1
- package/dist/{impl-Cxprr2hw.mjs → impl-C-PvYlFE.mjs} +2 -2
- package/dist/{impl-Cxprr2hw.mjs.map → impl-C-PvYlFE.mjs.map} +1 -1
- package/dist/impl-C36c5NfN.mjs +2 -0
- package/dist/impl-C36c5NfN.mjs.map +1 -0
- package/dist/{impl-B7l4bLG5.mjs → impl-CC-yFYWt.mjs} +2 -2
- package/dist/{impl-B7l4bLG5.mjs.map → impl-CC-yFYWt.mjs.map} +1 -1
- package/dist/{impl-CudSYx-g.mjs → impl-CFB_508q.mjs} +2 -2
- package/dist/{impl-CudSYx-g.mjs.map → impl-CFB_508q.mjs.map} +1 -1
- package/dist/{impl-DxQ9yj3H.mjs → impl-CG3f4B6u.mjs} +2 -2
- package/dist/{impl-DxQ9yj3H.mjs.map → impl-CG3f4B6u.mjs.map} +1 -1
- package/dist/{impl-DqHEIzpj.mjs → impl-CVUD-7mJ.mjs} +5 -5
- package/dist/{impl-DqHEIzpj.mjs.map → impl-CVUD-7mJ.mjs.map} +1 -1
- package/dist/{impl-BWPPVXG3.mjs → impl-CoqCyj7e.mjs} +3 -3
- package/dist/{impl-BWPPVXG3.mjs.map → impl-CoqCyj7e.mjs.map} +1 -1
- package/dist/{impl-BLQDgwxL.mjs → impl-Cq-GARM1.mjs} +2 -2
- package/dist/{impl-BLQDgwxL.mjs.map → impl-Cq-GARM1.mjs.map} +1 -1
- package/dist/{impl-DQG1pMzD2.mjs → impl-Cvyc-iTI2.mjs} +2 -2
- package/dist/{impl-DQG1pMzD2.mjs.map → impl-Cvyc-iTI2.mjs.map} +1 -1
- package/dist/impl-CwBa15M42.mjs +3 -0
- package/dist/impl-CwBa15M42.mjs.map +1 -0
- package/dist/{impl-CieztjdM.mjs → impl-D3gqip90.mjs} +2 -2
- package/dist/{impl-CieztjdM.mjs.map → impl-D3gqip90.mjs.map} +1 -1
- package/dist/{impl-DcL-8NEa2.mjs → impl-D6Lzwd-R2.mjs} +2 -2
- package/dist/{impl-DcL-8NEa2.mjs.map → impl-D6Lzwd-R2.mjs.map} +1 -1
- package/dist/impl-DG-041kN.mjs +3 -0
- package/dist/impl-DG-041kN.mjs.map +1 -0
- package/dist/{impl-DXbxO2VJ.mjs → impl-DTvnDByz.mjs} +2 -2
- package/dist/{impl-DXbxO2VJ.mjs.map → impl-DTvnDByz.mjs.map} +1 -1
- package/dist/{impl-Ds-gQfdc.mjs → impl-DUg1sDwg.mjs} +2 -2
- package/dist/{impl-Ds-gQfdc.mjs.map → impl-DUg1sDwg.mjs.map} +1 -1
- package/dist/{impl-B2ZXtnpX.mjs → impl-DldrBJEa.mjs} +2 -2
- package/dist/{impl-B2ZXtnpX.mjs.map → impl-DldrBJEa.mjs.map} +1 -1
- package/dist/{impl-D-a5xGld.mjs → impl-Dmn1CWts.mjs} +3 -3
- package/dist/{impl-D-a5xGld.mjs.map → impl-Dmn1CWts.mjs.map} +1 -1
- package/dist/impl-Dr9Jezjh2.mjs +2 -0
- package/dist/impl-Dr9Jezjh2.mjs.map +1 -0
- package/dist/{impl-DRKPx_I9.mjs → impl-DtTfsHtL.mjs} +2 -2
- package/dist/{impl-DRKPx_I9.mjs.map → impl-DtTfsHtL.mjs.map} +1 -1
- package/dist/{impl-FerHBNJx2.mjs → impl-DzNEfRoS2.mjs} +2 -2
- package/dist/{impl-FerHBNJx2.mjs.map → impl-DzNEfRoS2.mjs.map} +1 -1
- package/dist/{impl-wBcVYHlA.mjs → impl-HnrcGt_T.mjs} +2 -2
- package/dist/{impl-wBcVYHlA.mjs.map → impl-HnrcGt_T.mjs.map} +1 -1
- package/dist/{impl-D1f9mJL_.mjs → impl-QdSegO65.mjs} +2 -2
- package/dist/{impl-D1f9mJL_.mjs.map → impl-QdSegO65.mjs.map} +1 -1
- package/dist/{impl-C_Ifcb00.mjs → impl-S90NUBGm.mjs} +2 -2
- package/dist/{impl-C_Ifcb00.mjs.map → impl-S90NUBGm.mjs.map} +1 -1
- package/dist/{impl-DtpgD_as.mjs → impl-Tr08dgdk.mjs} +2 -2
- package/dist/{impl-DtpgD_as.mjs.map → impl-Tr08dgdk.mjs.map} +1 -1
- package/dist/{impl-Cb42aI60.mjs → impl-WJBuS_0m.mjs} +2 -2
- package/dist/{impl-Cb42aI60.mjs.map → impl-WJBuS_0m.mjs.map} +1 -1
- package/dist/{impl-DiwxYcux.mjs → impl-b4KAEVci.mjs} +2 -2
- package/dist/{impl-DiwxYcux.mjs.map → impl-b4KAEVci.mjs.map} +1 -1
- package/dist/impl-defjX-97.mjs +3 -0
- package/dist/impl-defjX-97.mjs.map +1 -0
- package/dist/{impl-DTadLabu.mjs → impl-fg0UZYw6.mjs} +2 -2
- package/dist/{impl-DTadLabu.mjs.map → impl-fg0UZYw6.mjs.map} +1 -1
- package/dist/{impl-Dr_l_SLd.mjs → impl-hRK54juc.mjs} +2 -2
- package/dist/{impl-Dr_l_SLd.mjs.map → impl-hRK54juc.mjs.map} +1 -1
- package/dist/{impl-DJcNhpbx.mjs → impl-mjDxMEDR.mjs} +2 -2
- package/dist/{impl-DJcNhpbx.mjs.map → impl-mjDxMEDR.mjs.map} +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +2 -2
- package/dist/{markRequestDataSiloIdsCompleted-BYNMCkhy.mjs → markRequestDataSiloIdsCompleted-C6lV_My-.mjs} +2 -2
- package/dist/{markRequestDataSiloIdsCompleted-BYNMCkhy.mjs.map → markRequestDataSiloIdsCompleted-C6lV_My-.mjs.map} +1 -1
- package/dist/{markSilentPrivacyRequests-gKYivzH1.mjs → markSilentPrivacyRequests-D3bFOMLh.mjs} +2 -2
- package/dist/{markSilentPrivacyRequests-gKYivzH1.mjs.map → markSilentPrivacyRequests-D3bFOMLh.mjs.map} +1 -1
- package/dist/{mergeTranscendInputs-D1CvxQu0.mjs → mergeTranscendInputs-B7WjxYMN.mjs} +3 -3
- package/dist/{mergeTranscendInputs-D1CvxQu0.mjs.map → mergeTranscendInputs-B7WjxYMN.mjs.map} +1 -1
- package/dist/{notifyPrivacyRequestsAdditionalTime-DbERhQ1Q.mjs → notifyPrivacyRequestsAdditionalTime-BGUxsWLN.mjs} +2 -2
- package/dist/{notifyPrivacyRequestsAdditionalTime-DbERhQ1Q.mjs.map → notifyPrivacyRequestsAdditionalTime-BGUxsWLN.mjs.map} +1 -1
- package/dist/{policy-bundle-manifest-BZnBMZQq.mjs → policy-bundle-manifest-RgsjPnfI.mjs} +3 -3
- package/dist/{policy-bundle-manifest-BZnBMZQq.mjs.map → policy-bundle-manifest-RgsjPnfI.mjs.map} +1 -1
- package/dist/{policy-project-discovery-C29UxWwt.mjs → policy-project-discovery-B4cFXUlA.mjs} +71 -68
- package/dist/policy-project-discovery-B4cFXUlA.mjs.map +1 -0
- package/dist/policy-scaffold-config-CwlygiTz.mjs +76 -0
- package/dist/policy-scaffold-config-CwlygiTz.mjs.map +1 -0
- package/dist/printResult-Dmwv78e7.mjs +33 -0
- package/dist/printResult-Dmwv78e7.mjs.map +1 -0
- package/dist/{pullAllDatapoints-Bm-Orhse.mjs → pullAllDatapoints-CNqQSSmF.mjs} +3 -3
- package/dist/{pullAllDatapoints-Bm-Orhse.mjs.map → pullAllDatapoints-CNqQSSmF.mjs.map} +1 -1
- package/dist/pullChunkedCustomSiloOutstandingIdentifiers-BfNNWqeI.mjs +2 -0
- package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-BfNNWqeI.mjs.map} +1 -1
- package/dist/{pullManualEnrichmentIdentifiersToCsv-DMC5CQtE.mjs → pullManualEnrichmentIdentifiersToCsv-B_lWa6Yg.mjs} +2 -2
- package/dist/{pullManualEnrichmentIdentifiersToCsv-DMC5CQtE.mjs.map → pullManualEnrichmentIdentifiersToCsv-B_lWa6Yg.mjs.map} +1 -1
- package/dist/{pushCronIdentifiersFromCsv-DhS2z8IG.mjs → pushCronIdentifiersFromCsv-CDhlEf6n.mjs} +2 -2
- package/dist/{pushCronIdentifiersFromCsv-DhS2z8IG.mjs.map → pushCronIdentifiersFromCsv-CDhlEf6n.mjs.map} +1 -1
- package/dist/pushManualEnrichmentIdentifiersFromCsv-Bn_028w5.mjs +2 -0
- package/dist/{pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs.map → pushManualEnrichmentIdentifiersFromCsv-Bn_028w5.mjs.map} +1 -1
- package/dist/{removeUnverifiedRequestIdentifiers-BkAcUZZN.mjs → removeUnverifiedRequestIdentifiers-DcI9ut4q.mjs} +2 -2
- package/dist/{removeUnverifiedRequestIdentifiers-BkAcUZZN.mjs.map → removeUnverifiedRequestIdentifiers-DcI9ut4q.mjs.map} +1 -1
- package/dist/resolveBundleIdByName-BPrMkU0w.mjs +2 -0
- package/dist/resolveBundleIdByName-BPrMkU0w.mjs.map +1 -0
- package/dist/resolvePolicyBundleVersion-BrVz4LKN.mjs +2 -0
- package/dist/resolvePolicyBundleVersion-BrVz4LKN.mjs.map +1 -0
- package/dist/{retryRequestDataSilos-BoPmcB8-.mjs → retryRequestDataSilos-ZdY2PM0S.mjs} +2 -2
- package/dist/{retryRequestDataSilos-BoPmcB8-.mjs.map → retryRequestDataSilos-ZdY2PM0S.mjs.map} +1 -1
- package/dist/{skipPreflightJobs-DkBdYw-r.mjs → skipPreflightJobs-KdcSw8Td.mjs} +2 -2
- package/dist/{skipPreflightJobs-DkBdYw-r.mjs.map → skipPreflightJobs-KdcSw8Td.mjs.map} +1 -1
- package/dist/{skipRequestDataSilos-BRFiokix.mjs → skipRequestDataSilos-Cy2NfP47.mjs} +2 -2
- package/dist/{skipRequestDataSilos-BRFiokix.mjs.map → skipRequestDataSilos-Cy2NfP47.mjs.map} +1 -1
- package/dist/{streamPrivacyRequestsToCsv-Bt-H5J-y.mjs → streamPrivacyRequestsToCsv-ByRBG8Mb.mjs} +2 -2
- package/dist/{streamPrivacyRequestsToCsv-Bt-H5J-y.mjs.map → streamPrivacyRequestsToCsv-ByRBG8Mb.mjs.map} +1 -1
- package/dist/{syncCodePackages-CPkEukDm.mjs → syncCodePackages-DJnrcX5l.mjs} +2 -2
- package/dist/{syncCodePackages-CPkEukDm.mjs.map → syncCodePackages-DJnrcX5l.mjs.map} +1 -1
- package/dist/updateConsentManagerVersionToLatest-KwMaAkwh.mjs +2 -0
- package/dist/{updateConsentManagerVersionToLatest-DWblAwus.mjs.map → updateConsentManagerVersionToLatest-KwMaAkwh.mjs.map} +1 -1
- package/dist/{uploadConsents-D7Vg8ZRW.mjs → uploadConsents-C5LmI-9T.mjs} +2 -2
- package/dist/{uploadConsents-D7Vg8ZRW.mjs.map → uploadConsents-C5LmI-9T.mjs.map} +1 -1
- package/dist/{uploadPrivacyRequestsFromCsv-B_hQwIn6.mjs → uploadPrivacyRequestsFromCsv-BsYnCgbl.mjs} +2 -2
- package/dist/{uploadPrivacyRequestsFromCsv-B_hQwIn6.mjs.map → uploadPrivacyRequestsFromCsv-BsYnCgbl.mjs.map} +1 -1
- package/package.json +4 -4
- package/dist/app-CR3U95JW.mjs.map +0 -1
- package/dist/buildExamples-B6BdW0FD.mjs +0 -2
- package/dist/buildExamples-B6BdW0FD.mjs.map +0 -1
- package/dist/impl-BqTMPbwc2.mjs +0 -2
- package/dist/impl-BqTMPbwc2.mjs.map +0 -1
- package/dist/impl-CAoIp9Nl2.mjs +0 -3
- package/dist/impl-CAoIp9Nl2.mjs.map +0 -1
- package/dist/impl-Cee7Q1Ne.mjs +0 -2
- package/dist/impl-Cee7Q1Ne.mjs.map +0 -1
- package/dist/impl-DQcgEx7V2.mjs +0 -298
- package/dist/impl-DezV3QMo.mjs +0 -3
- package/dist/impl-DezV3QMo.mjs.map +0 -1
- package/dist/impl-btKJ1-VJ.mjs +0 -3
- package/dist/impl-btKJ1-VJ.mjs.map +0 -1
- package/dist/impl-ijoNwhGI.mjs +0 -2
- package/dist/impl-ijoNwhGI.mjs.map +0 -1
- package/dist/policy-project-discovery-C29UxWwt.mjs.map +0 -1
- package/dist/policy-scaffold-config-BUKAyPad.mjs +0 -76
- package/dist/policy-scaffold-config-BUKAyPad.mjs.map +0 -1
- package/dist/printResult-C2K9ODeE.mjs +0 -33
- package/dist/printResult-C2K9ODeE.mjs.map +0 -1
- package/dist/pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs +0 -2
- package/dist/pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs +0 -2
- package/dist/resolveBundleIdByName-Dm_o5_bg.mjs +0 -2
- package/dist/resolveBundleIdByName-Dm_o5_bg.mjs.map +0 -1
- package/dist/resolvePolicyBundleVersion-DRUwe7fA.mjs +0 -2
- package/dist/resolvePolicyBundleVersion-DRUwe7fA.mjs.map +0 -1
- package/dist/updateConsentManagerVersionToLatest-DWblAwus.mjs +0 -2
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import{c as e,l as t,o as n,u as r}from"./policy-project-discovery-C29UxWwt.mjs";import{n as i,r as a,t as o}from"./jsonc-CdTubr53.mjs";import{posix as s,relative as c,sep as l}from"node:path";const u=`0.42.0`,d=`.github/workflows/transcend-policy.yml`,f=`d23441a48e516b6c34aea4fa41551a30e30af803`,p=`b2b258e089860efaadaaf71bf6e3aecb4a3eeff1`,m=`761188c3b435761fa254beca508a44875619648f`;function h(e,t){return e===`.`?t:s.join(e,t)}function g(n){let r=n.bundleDirectories??[h(n.workspaceDirectory,e)],i=[h(n.workspaceDirectory,`**/*.rego`),h(n.workspaceDirectory,`**/*.json`),h(n.workspaceDirectory,`**/*.yaml`),h(n.workspaceDirectory,`**/*.yml`),h(n.workspaceDirectory,`**/.manifest`),h(n.workspaceDirectory,`.regal/config.yaml`),h(n.workspaceDirectory,`.regal.yaml`),d].map(e=>` - ${JSON.stringify(e)}`).join(`
|
|
2
|
-
`),a;return a=r.length===0?` lint:
|
|
3
|
-
runs-on: ubuntu-latest
|
|
4
|
-
steps:
|
|
5
|
-
- uses: actions/checkout@${f} # v6
|
|
6
|
-
- name: No publishable bundles yet
|
|
7
|
-
run: >-
|
|
8
|
-
echo "Run transcend policy new to add a bundle;
|
|
9
|
-
policy new refreshes this workflow automatically."
|
|
10
|
-
`:r.length===1?` lint:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
steps:
|
|
13
|
-
- uses: actions/checkout@${f} # v6
|
|
14
|
-
- name: Set up OPA
|
|
15
|
-
uses: open-policy-agent/setup-opa@${p} # v2.4.0
|
|
16
|
-
with:
|
|
17
|
-
version: ${JSON.stringify(t)}
|
|
18
|
-
- name: Set up Regal
|
|
19
|
-
uses: open-policy-agent/setup-regal@${m} # v2.0.0
|
|
20
|
-
with:
|
|
21
|
-
version: ${JSON.stringify(u)}
|
|
22
|
-
- name: Install the Transcend CLI
|
|
23
|
-
run: npm install --global @transcend-io/cli@${n.cliVersion}
|
|
24
|
-
- name: Validate Policy Engine project
|
|
25
|
-
env:
|
|
26
|
-
POLICY_DIRECTORY: ${JSON.stringify(r[0])}
|
|
27
|
-
run: >-
|
|
28
|
-
transcend policy lint
|
|
29
|
-
"$POLICY_DIRECTORY"
|
|
30
|
-
--noInteractive
|
|
31
|
-
--json
|
|
32
|
-
`:` lint:
|
|
33
|
-
runs-on: ubuntu-latest
|
|
34
|
-
strategy:
|
|
35
|
-
fail-fast: false
|
|
36
|
-
matrix:
|
|
37
|
-
policy_directory:
|
|
38
|
-
${r.map(e=>` - ${JSON.stringify(e)}`).join(`
|
|
39
|
-
`)}
|
|
40
|
-
steps:
|
|
41
|
-
- uses: actions/checkout@${f} # v6
|
|
42
|
-
- name: Set up OPA
|
|
43
|
-
uses: open-policy-agent/setup-opa@${p} # v2.4.0
|
|
44
|
-
with:
|
|
45
|
-
version: ${JSON.stringify(t)}
|
|
46
|
-
- name: Set up Regal
|
|
47
|
-
uses: open-policy-agent/setup-regal@${m} # v2.0.0
|
|
48
|
-
with:
|
|
49
|
-
version: ${JSON.stringify(u)}
|
|
50
|
-
- name: Install the Transcend CLI
|
|
51
|
-
run: npm install --global @transcend-io/cli@${n.cliVersion}
|
|
52
|
-
- name: Validate Policy Engine project
|
|
53
|
-
env:
|
|
54
|
-
POLICY_DIRECTORY: \${{ matrix.policy_directory }}
|
|
55
|
-
run: transcend policy lint "$POLICY_DIRECTORY" --noInteractive --json
|
|
56
|
-
`,`# Generated by transcend policy init.
|
|
57
|
-
name: Transcend Policy
|
|
58
|
-
|
|
59
|
-
on:
|
|
60
|
-
pull_request:
|
|
61
|
-
paths:
|
|
62
|
-
${i}
|
|
63
|
-
push:
|
|
64
|
-
paths:
|
|
65
|
-
${i}
|
|
66
|
-
|
|
67
|
-
permissions:
|
|
68
|
-
contents: read
|
|
69
|
-
|
|
70
|
-
jobs:
|
|
71
|
-
${a}`}const _=`tsandall.opa`,v=`glebbash.opa-highlight-only`;function y(e,t){return JSON.stringify(e)===JSON.stringify(t)}function b(e,t){try{return{current:a(e??`{}
|
|
72
|
-
`,t)}}catch(t){return{contents:e??`{}
|
|
73
|
-
`,warning:`${t instanceof Error?t.message:String(t)} Existing content was left unchanged.`}}}function x(e,t,n,r){if(t.length===0)return{contents:e??`{}
|
|
74
|
-
`,warnings:r};try{return{contents:o(e,t,n),warnings:r}}catch(t){return{contents:e??`{}
|
|
75
|
-
`,warnings:[...r,`${t instanceof Error?t.message:String(t)} Existing content was left unchanged.`]}}}function S(e,t,n,r){t.forEach(({path:t,value:i,label:a})=>{let o=t.reduce((e,t)=>e&&typeof e==`object`&&!Array.isArray(e)?e[t]:void 0,e);o===void 0?n.push({path:t,value:i}):y(o,i)||r.push(`VS Code setting "${a}" has a repository-specific value and was left unchanged.`)})}function C(e){return e===`.`?"${workspaceFolder}":`\${workspaceFolder}/${e}`}function w(e,t){return c(e,t).split(l).join(`/`)||`.`}function T(e,t,n=r){let i=w(e,t),a=`${n}-bundle`;return C(i===`.`?a:`${i}/${a}`)}function E(e,t){let n=w(e,t);return C(n===`.`?`schemas`:`${n}/schemas`)}function D(e,t){let r=w(e,t);return r===`.`?`**/${n}`:`**/${r}/**/${n}`}function O(e,t,n=r){let i=w(e,t),a=`${n}-bundle`,o=i===`.`?`/${a}`:`/${i}/${a}`,s=i===`.`?`./schemas/${n}/input.json`:`./${i}/schemas/${n}/input.json`;return{fileMatch:[`${o}/input.json`,`${o}/input.example.json`],url:s}}function k(e,t,n,r){let a=b(e,`VS Code policy settings`);if(`warning`in a)return{contents:a.contents,warnings:[a.warning]};let{current:o}=a,s=[],c=[];if(r&&r.length>0){let e=o[`opa.roots`],a=r.map(e=>T(t,n,e));if(e===void 0)s.push({path:[`opa.roots`],value:a});else if(Array.isArray(e)&&e.every(e=>typeof e==`string`)){let t=i(e,a);y(t,e)||s.push({path:[`opa.roots`],value:t})}else c.push(`VS Code setting "opa.roots" is customized and was left unchanged.`)}S(o,[{path:[`opa.schema`],value:E(t,n),label:`opa.schema`},{path:[`opa.checkOnSave`],value:!0,label:`opa.checkOnSave`},{path:[`opa.strictMode`],value:!0,label:`opa.strictMode`},{path:[`opa.bundleMode`],value:!0,label:`opa.bundleMode`},{path:[`opa.formatter`],value:`opa-fmt-rego-v1`,label:`opa.formatter`}],s,c);let l=o[`files.associations`],u=D(t,n);if(l===void 0?s.push({path:[`files.associations`],value:{[u]:`json`}}):typeof l==`object`&&l&&!Array.isArray(l)?S(o,[{path:[`files.associations`,u],value:`json`,label:`files.associations."${u}"`}],s,c):c.push(`VS Code setting "files.associations" is customized and was left unchanged.`),r&&r.length>0){let e=r.map(e=>O(t,n,e)),i=o[`json.schemas`];if(i===void 0)s.push({path:[`json.schemas`],value:e});else if(Array.isArray(i)){let t=[...i];e.forEach(e=>{t.some(t=>typeof t==`object`&&!!t&&!Array.isArray(t)&&y(t,e))||(t.find(t=>typeof t==`object`&&!!t&&!Array.isArray(t)&&typeof t.url==`string`&&t.url===e.url)===void 0?t=[...t,e]:c.push(`VS Code setting "json.schemas" has a repository-specific entry for the ${e.url} schema and was left unchanged.`))}),y(t,i)||s.push({path:[`json.schemas`],value:t})}else c.push(`VS Code setting "json.schemas" is customized and was left unchanged.`)}let d=o[`[rego]`];return d===void 0?s.push({path:[`[rego]`],value:{"editor.defaultFormatter":_,"editor.formatOnSave":!0,"editor.insertSpaces":!1,"editor.tabSize":4}}):typeof d==`object`&&d&&!Array.isArray(d)?S(o,[{path:[`[rego]`,`editor.defaultFormatter`],value:_,label:`[rego].editor.defaultFormatter`},{path:[`[rego]`,`editor.formatOnSave`],value:!0,label:`[rego].editor.formatOnSave`},{path:[`[rego]`,`editor.insertSpaces`],value:!1,label:`[rego].editor.insertSpaces`},{path:[`[rego]`,`editor.tabSize`],value:4,label:`[rego].editor.tabSize`}],s,c):c.push(`VS Code language setting "[rego]" is customized and was left unchanged.`),x(e,s,`VS Code policy settings`,c)}function A(e){let t=b(e,`VS Code policy extension recommendations`);if(`warning`in t)return{contents:t.contents,warnings:[t.warning]};let{current:n}=t,r=[],a=[],o=n.recommendations;if(o===void 0||Array.isArray(o)&&o.every(e=>typeof e==`string`)){let e=o??[],t=i(e,[_]).filter(e=>e!==v);y(e,t)||r.push({path:[`recommendations`],value:t})}else a.push(`VS Code extension recommendations use an unknown shape and were left unchanged.`);let s=n.unwantedRecommendations;if(s===void 0||Array.isArray(s)&&s.every(e=>typeof e==`string`)){let e=s??[],t=i(e,[v]);y(e,t)||r.push({path:[`unwantedRecommendations`],value:t})}else a.push(`VS Code unwanted extension recommendations use an unknown shape and were left unchanged.`);return x(e,r,`VS Code policy extension recommendations`,a)}function j(e,t,n=r){let i=w(e,t),a=`${n}-bundle`,o=i===`.`?a:`${i}/${a}`;return{label:`policy: lint ${n}`,type:`process`,command:`transcend`,args:[`policy`,`lint`,o,`--noInteractive`],group:{kind:`test`,isDefault:!1},problemMatcher:[]}}function M(e){return{label:`policy: lint`,dependsOn:e.map(e=>`policy: lint ${e}`),dependsOrder:`sequence`,group:{kind:`test`,isDefault:!0},problemMatcher:[]}}function N(e,t,n,r){let i=b(e,`VS Code policy tasks`);if(`warning`in i)return{contents:i.contents,warnings:[i.warning]};let{current:a}=i,o=[],s=[],c=a.version;if(c===void 0?o.push({path:[`version`],value:`2.0.0`}):c!==`2.0.0`&&s.push(`VS Code task schema version is customized and was left unchanged.`),!r||r.length===0)return x(e,o,`VS Code policy tasks`,s);let l=r.map(e=>j(t,n,e)),u=M(r),d=[...l,u],f=new Set(d.map(e=>e.label)),p=a.tasks;if(p===void 0)o.push({path:[`tasks`],value:d});else if(Array.isArray(p)){let e=[...p],t=!1;d.forEach(n=>{let r=n.label,i=e.findIndex(e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&e.label===r);if(i===-1){e=[...e,n],t=!0;return}y(e[i],n)||(f.has(r)?(e=e.map((e,t)=>t===i?n:e),t=!0):s.push(`VS Code task "${r}" has repository-specific customization and was left unchanged.`))}),t&&o.push({path:[`tasks`],value:e})}else s.push(`VS Code tasks use an unknown shape and were left unchanged.`);return x(e,o,`VS Code policy tasks`,s)}export{g as a,d as i,k as n,N as r,A as t};
|
|
76
|
-
//# sourceMappingURL=policy-scaffold-config-BUKAyPad.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"policy-scaffold-config-BUKAyPad.mjs","names":[],"sources":["../src/lib/policy/policy-scaffold-artifacts.ts","../src/lib/policy/policy-scaffold-config.ts"],"sourcesContent":["import { posix } from 'node:path';\n\nimport {\n POLICY_STARTER_BUNDLE_DIRECTORY,\n POLICY_STARTER_OPA_VERSION,\n} from './policy-scaffold-templates.js';\n\n/** Regal version pinned by generated policy validation. */\nexport const POLICY_STARTER_REGAL_VERSION = '0.42.0';\n\n/** Repository-relative generated workflow path. */\nexport const POLICY_CI_WORKFLOW_PATH = '.github/workflows/transcend-policy.yml';\n\n/** Immutable actions/checkout v6 release commit. */\nexport const ACTIONS_CHECKOUT_SHA = 'd23441a48e516b6c34aea4fa41551a30e30af803';\n\n/** Immutable open-policy-agent/setup-opa v2.4.0 release commit. */\nexport const SETUP_OPA_SHA = 'b2b258e089860efaadaaf71bf6e3aecb4a3eeff1';\n\n/** Immutable open-policy-agent/setup-regal v2.0.0 release commit. */\nexport const SETUP_REGAL_SHA = '761188c3b435761fa254beca508a44875619648f';\n\n/**\n * Prefix a path below the repository-relative policy workspace.\n *\n * @param workspaceDirectory - POSIX repository-relative workspace\n * @param child - POSIX workspace-relative path or pattern\n * @returns Repository-relative path or pattern\n */\nfunction workspacePath(workspaceDirectory: string, child: string): string {\n return workspaceDirectory === '.' ? child : posix.join(workspaceDirectory, child);\n}\n\n/**\n * Generate credential-free, validation-only Policy Engine CI.\n *\n * Path filters watch the whole policy workspace. Lint runs against each\n * publishable `{root}-bundle/` directory.\n *\n * @param options - Repository paths and exact CLI release\n * @returns Complete GitHub Actions workflow YAML\n */\nexport function generatePolicyGithubActionsWorkflow(options: {\n /** Exact released Transcend CLI version. */\n cliVersion: string;\n /** Policy workspace directory relative to the repository root. */\n workspaceDirectory: string;\n /**\n * Publish directories to lint, relative to the repository root.\n *\n * Pass an empty array for a workspace with no bundles yet (`policy init`).\n * Defaults to the disposable starter bundle under the workspace when omitted.\n */\n bundleDirectories?: readonly string[];\n}): string {\n const bundleDirectories = options.bundleDirectories ?? [\n workspacePath(options.workspaceDirectory, POLICY_STARTER_BUNDLE_DIRECTORY),\n ];\n const watchedPaths = [\n workspacePath(options.workspaceDirectory, '**/*.rego'),\n workspacePath(options.workspaceDirectory, '**/*.json'),\n workspacePath(options.workspaceDirectory, '**/*.yaml'),\n workspacePath(options.workspaceDirectory, '**/*.yml'),\n workspacePath(options.workspaceDirectory, '**/.manifest'),\n workspacePath(options.workspaceDirectory, '.regal/config.yaml'),\n workspacePath(options.workspaceDirectory, '.regal.yaml'),\n POLICY_CI_WORKFLOW_PATH,\n ];\n const pathFilters = watchedPaths.map((path) => ` - ${JSON.stringify(path)}`).join('\\n');\n\n let lintJob: string;\n if (bundleDirectories.length === 0) {\n lintJob = ` lint:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@${ACTIONS_CHECKOUT_SHA} # v6\n - name: No publishable bundles yet\n run: >-\n echo \"Run transcend policy new to add a bundle;\n policy new refreshes this workflow automatically.\"\n`;\n } else if (bundleDirectories.length === 1) {\n lintJob = ` lint:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@${ACTIONS_CHECKOUT_SHA} # v6\n - name: Set up OPA\n uses: open-policy-agent/setup-opa@${SETUP_OPA_SHA} # v2.4.0\n with:\n version: ${JSON.stringify(POLICY_STARTER_OPA_VERSION)}\n - name: Set up Regal\n uses: open-policy-agent/setup-regal@${SETUP_REGAL_SHA} # v2.0.0\n with:\n version: ${JSON.stringify(POLICY_STARTER_REGAL_VERSION)}\n - name: Install the Transcend CLI\n run: npm install --global @transcend-io/cli@${options.cliVersion}\n - name: Validate Policy Engine project\n env:\n POLICY_DIRECTORY: ${JSON.stringify(bundleDirectories[0])}\n run: >-\n transcend policy lint\n \"$POLICY_DIRECTORY\"\n --noInteractive\n --json\n`;\n } else {\n lintJob = ` lint:\n runs-on: ubuntu-latest\n strategy:\n fail-fast: false\n matrix:\n policy_directory:\n${bundleDirectories.map((directory) => ` - ${JSON.stringify(directory)}`).join('\\n')}\n steps:\n - uses: actions/checkout@${ACTIONS_CHECKOUT_SHA} # v6\n - name: Set up OPA\n uses: open-policy-agent/setup-opa@${SETUP_OPA_SHA} # v2.4.0\n with:\n version: ${JSON.stringify(POLICY_STARTER_OPA_VERSION)}\n - name: Set up Regal\n uses: open-policy-agent/setup-regal@${SETUP_REGAL_SHA} # v2.0.0\n with:\n version: ${JSON.stringify(POLICY_STARTER_REGAL_VERSION)}\n - name: Install the Transcend CLI\n run: npm install --global @transcend-io/cli@${options.cliVersion}\n - name: Validate Policy Engine project\n env:\n POLICY_DIRECTORY: \\${{ matrix.policy_directory }}\n run: transcend policy lint \"$POLICY_DIRECTORY\" --noInteractive --json\n`;\n }\n\n return `# Generated by transcend policy init.\nname: Transcend Policy\n\non:\n pull_request:\n paths:\n${pathFilters}\n push:\n paths:\n${pathFilters}\n\npermissions:\n contents: read\n\njobs:\n${lintJob}`;\n}\n","import { relative, sep } from 'node:path';\n\nimport {\n mergeJsonc,\n mergeStringArray,\n parseJsoncObject,\n type JsoncUpdate,\n} from '../scaffolding/jsonc.js';\nimport { POLICY_MANIFEST_FILENAME, POLICY_STARTER_ROOT } from './policy-scaffold-templates.js';\n\n/** Recommended VS Code extension for OPA and Regal authoring. */\nexport const POLICY_VSCODE_EXTENSION = 'tsandall.opa';\n\n/** Conflicting syntax-only VS Code extension. */\nexport const CONFLICTING_POLICY_VSCODE_EXTENSION = 'glebbash.opa-highlight-only';\n\n/** Result of safely merging one repository editor artifact. */\nexport interface PolicyEditorMergeResult {\n /** Complete merged contents, or the unchanged original when unsafe. */\n contents: string;\n /** Actionable preservation warnings. */\n warnings: string[];\n}\n\n/** One desired scalar setting that must not replace a customization. */\ninterface DesiredSetting {\n /** JSONC object path. */\n path: string[];\n /** Desired generated value. */\n value: unknown;\n /** Human-readable setting key. */\n label: string;\n}\n\n/**\n * Compare JSON-compatible configuration values.\n *\n * @param left - Existing value\n * @param right - Desired value\n * @returns Whether the values are structurally equal\n */\nfunction configurationValuesEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\n/**\n * Parse an editor object while preserving malformed existing content.\n *\n * @param contents - Existing JSONC, or null\n * @param label - Configuration label\n * @returns Parsed object or a preservation result\n */\nfunction parseEditorObject(\n contents: string | null,\n label: string,\n):\n | {\n /** Parsed JSONC object. */\n current: Record<string, unknown>;\n }\n | {\n /** Complete unchanged contents. */\n contents: string;\n /** Actionable warning. */\n warning: string;\n } {\n try {\n return { current: parseJsoncObject(contents ?? '{}\\n', label) };\n } catch (error) {\n return {\n contents: contents ?? '{}\\n',\n warning: `${error instanceof Error ? error.message : String(error)} Existing content was left unchanged.`,\n };\n }\n}\n\n/**\n * Apply safe JSONC updates or preserve the existing file when comments prevent it.\n *\n * @param contents - Existing JSONC\n * @param updates - Proven-safe updates\n * @param label - Configuration label\n * @param warnings - Existing merge warnings\n * @returns Complete contents and warnings\n */\nfunction applyEditorUpdates(\n contents: string | null,\n updates: readonly JsoncUpdate[],\n label: string,\n warnings: string[],\n): PolicyEditorMergeResult {\n if (updates.length === 0) {\n return { contents: contents ?? '{}\\n', warnings };\n }\n try {\n return {\n contents: mergeJsonc(contents, updates, label),\n warnings,\n };\n } catch (error) {\n return {\n contents: contents ?? '{}\\n',\n warnings: [\n ...warnings,\n `${error instanceof Error ? error.message : String(error)} Existing content was left unchanged.`,\n ],\n };\n }\n}\n\n/**\n * Add absent scalar settings without replacing repository customizations.\n *\n * @param current - Parsed editor object\n * @param desired - Desired settings\n * @param updates - Safe updates to append to\n * @param warnings - Conflict warnings to append to\n */\nfunction collectSafeScalarUpdates(\n current: Record<string, unknown>,\n desired: readonly DesiredSetting[],\n updates: JsoncUpdate[],\n warnings: string[],\n): void {\n desired.forEach(({ path, value, label }) => {\n const existing = path.reduce<unknown>((parent, key) => {\n return parent && typeof parent === 'object' && !Array.isArray(parent)\n ? (parent as Record<string, unknown>)[key]\n : undefined;\n }, current);\n if (existing === undefined) {\n updates.push({ path, value });\n } else if (!configurationValuesEqual(existing, value)) {\n warnings.push(\n `VS Code setting \"${label}\" has a repository-specific value and was left unchanged.`,\n );\n }\n });\n}\n\n/**\n * Build a `${workspaceFolder}/…` path for a repository-relative POSIX path.\n *\n * @param repositoryRelativePath - Path relative to the repository root\n * @returns VS Code workspace path\n */\nfunction buildWorkspaceFolderPath(repositoryRelativePath: string): string {\n return repositoryRelativePath === '.'\n ? '${workspaceFolder}'\n : `\\${workspaceFolder}/${repositoryRelativePath}`;\n}\n\n/**\n * Repository-relative POSIX path from the root that owns `.vscode`.\n *\n * @param repositoryRoot - Root that owns `.vscode`\n * @param absolutePath - Absolute path below the repository\n * @returns POSIX repository-relative path\n */\nfunction repositoryRelativePosix(repositoryRoot: string, absolutePath: string): string {\n return relative(repositoryRoot, absolutePath).split(sep).join('/') || '.';\n}\n\n/**\n * Build the workspace-relative OPA publish root for a bundle.\n *\n * @param repositoryRoot - Root that owns `.vscode`\n * @param workspaceDirectory - Selected policy workspace directory\n * @param root - Package root name\n * @returns VS Code workspace path\n */\nfunction buildOpaBundleRoot(\n repositoryRoot: string,\n workspaceDirectory: string,\n root: string = POLICY_STARTER_ROOT,\n): string {\n const workspace = repositoryRelativePosix(repositoryRoot, workspaceDirectory);\n const bundleDir = `${root}-bundle`;\n const bundle = workspace === '.' ? bundleDir : `${workspace}/${bundleDir}`;\n return buildWorkspaceFolderPath(bundle);\n}\n\n/**\n * Build the workspace-relative schemas directory path.\n *\n * @param repositoryRoot - Root that owns `.vscode`\n * @param workspaceDirectory - Selected policy workspace directory\n * @returns VS Code workspace path\n */\nfunction buildOpaSchemaDirectory(repositoryRoot: string, workspaceDirectory: string): string {\n const workspace = repositoryRelativePosix(repositoryRoot, workspaceDirectory);\n const schemas = workspace === '.' ? 'schemas' : `${workspace}/schemas`;\n return buildWorkspaceFolderPath(schemas);\n}\n\n/**\n * Build a `files.associations` glob for every `.manifest` under the workspace.\n *\n * Patterns that contain `/` are matched against the absolute file path, so a\n * leading `**\\/` prefix is required for a portable workspace-relative association.\n *\n * @param repositoryRoot - Root that owns `.vscode`\n * @param workspaceDirectory - Selected policy workspace directory\n * @returns Association pattern key\n */\nfunction buildPolicyManifestAssociationPattern(\n repositoryRoot: string,\n workspaceDirectory: string,\n): string {\n const workspace = repositoryRelativePosix(repositoryRoot, workspaceDirectory);\n return workspace === '.'\n ? `**/${POLICY_MANIFEST_FILENAME}`\n : `**/${workspace}/**/${POLICY_MANIFEST_FILENAME}`;\n}\n\n/**\n * Build `json.schemas` fileMatch globs for a bundle's input documents.\n *\n * @param repositoryRoot - Root that owns `.vscode`\n * @param workspaceDirectory - Selected policy workspace directory\n * @param root - Package root name\n * @returns Absolute-style fileMatch paths and schema URL\n */\nfunction buildBundleInputJsonSchema(\n repositoryRoot: string,\n workspaceDirectory: string,\n root: string = POLICY_STARTER_ROOT,\n): {\n /** VS Code fileMatch globs (leading slash = workspace-relative). */\n fileMatch: string[];\n /** Relative URL to the input schema. */\n url: string;\n} {\n const workspace = repositoryRelativePosix(repositoryRoot, workspaceDirectory);\n const bundleDir = `${root}-bundle`;\n const bundlePrefix = workspace === '.' ? `/${bundleDir}` : `/${workspace}/${bundleDir}`;\n const schemaUrl =\n workspace === '.'\n ? `./schemas/${root}/input.json`\n : `./${workspace}/schemas/${root}/input.json`;\n return {\n fileMatch: [`${bundlePrefix}/input.json`, `${bundlePrefix}/input.example.json`],\n url: schemaUrl,\n };\n}\n\n/**\n * Merge strict workspace-scoped OPA and Rego editor settings.\n *\n * Setting names match the authoritative `open-policy-agent/vscode-opa`\n * extension metadata. Existing conflicting values are preserved and reported.\n *\n * When `bundleRoots` is provided, `opa.roots` and `json.schemas` are populated\n * for those bundles. When omitted (init without bundles), `opa.roots` and\n * `json.schemas` are left empty or unset.\n *\n * @param contents - Existing `.vscode/settings.json` JSONC\n * @param repositoryRoot - Root that owns `.vscode`\n * @param workspaceDirectory - Selected policy workspace directory\n * @param bundleRoots - Bundle roots to add to `opa.roots` and `json.schemas`\n * @returns Merged settings and conflict warnings\n */\nexport function mergePolicyEditorSettings(\n contents: string | null,\n repositoryRoot: string,\n workspaceDirectory: string,\n bundleRoots?: readonly string[],\n): PolicyEditorMergeResult {\n const parsed = parseEditorObject(contents, 'VS Code policy settings');\n if ('warning' in parsed) {\n return { contents: parsed.contents, warnings: [parsed.warning] };\n }\n const { current } = parsed;\n const updates: JsoncUpdate[] = [];\n const warnings: string[] = [];\n\n if (bundleRoots && bundleRoots.length > 0) {\n const roots = current['opa.roots'];\n const desiredRoots = bundleRoots.map((root) =>\n buildOpaBundleRoot(repositoryRoot, workspaceDirectory, root),\n );\n if (roots === undefined) {\n updates.push({ path: ['opa.roots'], value: desiredRoots });\n } else if (Array.isArray(roots) && roots.every((value) => typeof value === 'string')) {\n const merged = mergeStringArray(roots, desiredRoots);\n if (!configurationValuesEqual(merged, roots)) {\n updates.push({ path: ['opa.roots'], value: merged });\n }\n } else {\n warnings.push('VS Code setting \"opa.roots\" is customized and was left unchanged.');\n }\n }\n\n collectSafeScalarUpdates(\n current,\n [\n {\n path: ['opa.schema'],\n value: buildOpaSchemaDirectory(repositoryRoot, workspaceDirectory),\n label: 'opa.schema',\n },\n { path: ['opa.checkOnSave'], value: true, label: 'opa.checkOnSave' },\n { path: ['opa.strictMode'], value: true, label: 'opa.strictMode' },\n { path: ['opa.bundleMode'], value: true, label: 'opa.bundleMode' },\n { path: ['opa.formatter'], value: 'opa-fmt-rego-v1', label: 'opa.formatter' },\n ],\n updates,\n warnings,\n );\n\n const associations = current['files.associations'];\n const manifestAssociation = buildPolicyManifestAssociationPattern(\n repositoryRoot,\n workspaceDirectory,\n );\n if (associations === undefined) {\n updates.push({\n path: ['files.associations'],\n value: { [manifestAssociation]: 'json' },\n });\n } else if (\n associations !== null &&\n typeof associations === 'object' &&\n !Array.isArray(associations)\n ) {\n collectSafeScalarUpdates(\n current,\n [\n {\n path: ['files.associations', manifestAssociation],\n value: 'json',\n label: `files.associations.\"${manifestAssociation}\"`,\n },\n ],\n updates,\n warnings,\n );\n } else {\n warnings.push('VS Code setting \"files.associations\" is customized and was left unchanged.');\n }\n\n if (bundleRoots && bundleRoots.length > 0) {\n const desiredJsonSchemas = bundleRoots.map((root) =>\n buildBundleInputJsonSchema(repositoryRoot, workspaceDirectory, root),\n );\n const jsonSchemas = current['json.schemas'];\n if (jsonSchemas === undefined) {\n updates.push({ path: ['json.schemas'], value: desiredJsonSchemas });\n } else if (Array.isArray(jsonSchemas)) {\n let merged = [...jsonSchemas];\n desiredJsonSchemas.forEach((desired) => {\n const hasMatch = merged.some(\n (entry) =>\n entry !== null &&\n typeof entry === 'object' &&\n !Array.isArray(entry) &&\n configurationValuesEqual(entry, desired),\n );\n if (!hasMatch) {\n const conflicting = merged.find(\n (entry) =>\n entry !== null &&\n typeof entry === 'object' &&\n !Array.isArray(entry) &&\n typeof (entry as Record<string, unknown>).url === 'string' &&\n (entry as Record<string, unknown>).url === desired.url,\n );\n if (conflicting === undefined) {\n merged = [...merged, desired];\n } else {\n warnings.push(\n `VS Code setting \"json.schemas\" has a repository-specific entry for the ${(desired as Record<string, unknown>).url as string} schema and was left unchanged.`,\n );\n }\n }\n });\n if (!configurationValuesEqual(merged, jsonSchemas)) {\n updates.push({ path: ['json.schemas'], value: merged });\n }\n } else {\n warnings.push('VS Code setting \"json.schemas\" is customized and was left unchanged.');\n }\n }\n\n const regoSettings = current['[rego]'];\n if (regoSettings === undefined) {\n updates.push({\n path: ['[rego]'],\n value: {\n 'editor.defaultFormatter': POLICY_VSCODE_EXTENSION,\n 'editor.formatOnSave': true,\n 'editor.insertSpaces': false,\n 'editor.tabSize': 4,\n },\n });\n } else if (\n regoSettings !== null &&\n typeof regoSettings === 'object' &&\n !Array.isArray(regoSettings)\n ) {\n collectSafeScalarUpdates(\n current,\n [\n {\n path: ['[rego]', 'editor.defaultFormatter'],\n value: POLICY_VSCODE_EXTENSION,\n label: '[rego].editor.defaultFormatter',\n },\n {\n path: ['[rego]', 'editor.formatOnSave'],\n value: true,\n label: '[rego].editor.formatOnSave',\n },\n {\n path: ['[rego]', 'editor.insertSpaces'],\n value: false,\n label: '[rego].editor.insertSpaces',\n },\n {\n path: ['[rego]', 'editor.tabSize'],\n value: 4,\n label: '[rego].editor.tabSize',\n },\n ],\n updates,\n warnings,\n );\n } else {\n warnings.push('VS Code language setting \"[rego]\" is customized and was left unchanged.');\n }\n\n return applyEditorUpdates(contents, updates, 'VS Code policy settings', warnings);\n}\n\n/**\n * Merge OPA extension recommendations without disturbing unknown entries.\n *\n * VS Code's `extensions.json` schema supports `unwantedRecommendations`, so\n * the syntax-only extension can be removed from recommendations and discouraged.\n *\n * @param contents - Existing `.vscode/extensions.json` JSONC\n * @returns Merged extension recommendations and warnings\n */\nexport function mergePolicyEditorExtensions(contents: string | null): PolicyEditorMergeResult {\n const parsed = parseEditorObject(contents, 'VS Code policy extension recommendations');\n if ('warning' in parsed) {\n return { contents: parsed.contents, warnings: [parsed.warning] };\n }\n const { current } = parsed;\n const updates: JsoncUpdate[] = [];\n const warnings: string[] = [];\n\n const recommendations = current.recommendations;\n if (\n recommendations === undefined ||\n (Array.isArray(recommendations) && recommendations.every((value) => typeof value === 'string'))\n ) {\n const existing = recommendations ?? [];\n const desired = mergeStringArray(existing, [POLICY_VSCODE_EXTENSION]).filter(\n (value) => value !== CONFLICTING_POLICY_VSCODE_EXTENSION,\n );\n if (!configurationValuesEqual(existing, desired)) {\n updates.push({ path: ['recommendations'], value: desired });\n }\n } else {\n warnings.push(\n 'VS Code extension recommendations use an unknown shape and were left unchanged.',\n );\n }\n\n const unwanted = current.unwantedRecommendations;\n if (\n unwanted === undefined ||\n (Array.isArray(unwanted) && unwanted.every((value) => typeof value === 'string'))\n ) {\n const existing = unwanted ?? [];\n const desired = mergeStringArray(existing, [CONFLICTING_POLICY_VSCODE_EXTENSION]);\n if (!configurationValuesEqual(existing, desired)) {\n updates.push({ path: ['unwantedRecommendations'], value: desired });\n }\n } else {\n warnings.push(\n 'VS Code unwanted extension recommendations use an unknown shape and were left unchanged.',\n );\n }\n\n return applyEditorUpdates(\n contents,\n updates,\n 'VS Code policy extension recommendations',\n warnings,\n );\n}\n\n/**\n * Build a VS Code lint task for one bundle.\n *\n * @param repositoryRoot - Root that owns `.vscode`\n * @param workspaceDirectory - Selected policy workspace directory\n * @param root - Package root name\n * @returns VS Code task object\n */\nexport function buildPolicyLintTask(\n repositoryRoot: string,\n workspaceDirectory: string,\n root: string = POLICY_STARTER_ROOT,\n): Record<string, unknown> {\n const workspace = repositoryRelativePosix(repositoryRoot, workspaceDirectory);\n const bundleDir = `${root}-bundle`;\n const bundle = workspace === '.' ? bundleDir : `${workspace}/${bundleDir}`;\n return {\n label: `policy: lint ${root}`,\n type: 'process',\n command: 'transcend',\n args: ['policy', 'lint', bundle, '--noInteractive'],\n group: {\n kind: 'test',\n isDefault: false,\n },\n problemMatcher: [],\n };\n}\n\n/**\n * Build the aggregate \"policy: lint\" task (runs all bundles).\n *\n * @param roots - All bundle root names\n * @returns VS Code task object\n */\nexport function buildPolicyAggregateLintTask(roots: readonly string[]): Record<string, unknown> {\n return {\n label: 'policy: lint',\n dependsOn: roots.map((root) => `policy: lint ${root}`),\n dependsOrder: 'sequence',\n group: {\n kind: 'test',\n isDefault: true,\n },\n problemMatcher: [],\n };\n}\n\n/**\n * Merge policy lint tasks while preserving custom tasks.\n *\n * When `bundleRoots` is provided, creates per-bundle tasks and an aggregate.\n * Managed `policy: lint*` tasks are updated in place as roots grow. When\n * omitted, skips task creation (init without bundles).\n *\n * @param contents - Existing `.vscode/tasks.json` JSONC\n * @param repositoryRoot - Root that owns `.vscode`\n * @param workspaceDirectory - Selected policy workspace directory\n * @param bundleRoots - Bundle roots to generate tasks for\n * @returns Merged task configuration and warnings\n */\nexport function mergePolicyEditorTasks(\n contents: string | null,\n repositoryRoot: string,\n workspaceDirectory: string,\n bundleRoots?: readonly string[],\n): PolicyEditorMergeResult {\n const parsed = parseEditorObject(contents, 'VS Code policy tasks');\n if ('warning' in parsed) {\n return { contents: parsed.contents, warnings: [parsed.warning] };\n }\n const { current } = parsed;\n const updates: JsoncUpdate[] = [];\n const warnings: string[] = [];\n const version = current.version;\n if (version === undefined) {\n updates.push({ path: ['version'], value: '2.0.0' });\n } else if (version !== '2.0.0') {\n warnings.push('VS Code task schema version is customized and was left unchanged.');\n }\n\n if (!bundleRoots || bundleRoots.length === 0) {\n return applyEditorUpdates(contents, updates, 'VS Code policy tasks', warnings);\n }\n\n const desiredPerBundleTasks = bundleRoots.map((root) =>\n buildPolicyLintTask(repositoryRoot, workspaceDirectory, root),\n );\n const desiredAggregateTask = buildPolicyAggregateLintTask(bundleRoots);\n const desiredTasks = [...desiredPerBundleTasks, desiredAggregateTask];\n const managedLabels = new Set(desiredTasks.map((task) => task.label as string));\n const tasks = current.tasks;\n if (tasks === undefined) {\n updates.push({ path: ['tasks'], value: desiredTasks });\n } else if (Array.isArray(tasks)) {\n let merged = [...tasks];\n let changed = false;\n desiredTasks.forEach((desired) => {\n const label = desired.label as string;\n const matchingIndex = merged.findIndex(\n (task) =>\n task !== null &&\n typeof task === 'object' &&\n !Array.isArray(task) &&\n (task as Record<string, unknown>).label === label,\n );\n if (matchingIndex === -1) {\n merged = [...merged, desired];\n changed = true;\n return;\n }\n if (!configurationValuesEqual(merged[matchingIndex], desired)) {\n if (managedLabels.has(label)) {\n merged = merged.map((task, index) => (index === matchingIndex ? desired : task));\n changed = true;\n } else {\n warnings.push(\n `VS Code task \"${label}\" has repository-specific customization and was left unchanged.`,\n );\n }\n }\n });\n if (changed) {\n updates.push({ path: ['tasks'], value: merged });\n }\n } else {\n warnings.push('VS Code tasks use an unknown shape and were left unchanged.');\n }\n\n return applyEditorUpdates(contents, updates, 'VS Code policy tasks', warnings);\n}\n"],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./policyEngineCliError-CZrOHhLv.mjs";import t from"got";const n=5120,r=51200;function i(e,n){let r=e.replace(/\/$/,``);if(/(^|\/)v1$/i.test(r))throw Error(`--transcend-url must not include a trailing "/v1" (the CLI appends it automatically). Got "${e}"; use "${r.replace(/\/v1$/i,``)}" instead.`);return t.extend({prefixUrl:r,headers:{Authorization:`Bearer ${n}`,accept:`application/json`}})}function a(e){if(typeof e==`string`)try{return JSON.parse(e).message}catch{return e.length>0?e:void 0}if(e&&typeof e==`object`&&`message`in e){let t=e.message;if(typeof t==`string`&&t.length>0)return t}}function o(e,t){if(!e)return;let n=e[t]??e[t.toLowerCase()];return Array.isArray(n)?n[0]:n}function s(e,t){if(e)return e;let n=o(t,`retry-after`),r=o(t,`x-ratelimit-reset`),i=`Rate limit exceeded (429 Too Many Requests).
|
|
2
|
-
|
|
3
|
-
Fix:
|
|
4
|
-
- Wait and retry the command`;return n?i+=`\n- Retry after ${n} second(s)`:r&&(i+=`\n- Retry after ${r}`),i}function c(e,t,n){switch(e){case 401:return`Authentication failed (401 Unauthorized).
|
|
5
|
-
|
|
6
|
-
Your Transcend API key is missing, invalid, or does not have permission for this command.
|
|
7
|
-
|
|
8
|
-
Fix:
|
|
9
|
-
- Set a valid API key: export TRANSCEND_API_KEY=<your-key>
|
|
10
|
-
or pass --auth=<your-key>
|
|
11
|
-
- Ensure the key has the required Policy Engine scopes (e.g. View/Manage/Activate Policy)
|
|
12
|
-
- Confirm you are pointing at the correct environment (--transcend-url)`;case 403:return t??`Access was denied (403 Forbidden). If this persists, contact your Transcend admin.`;case 404:return`Resource not found (404 Not Found).
|
|
13
|
-
|
|
14
|
-
The requested policy bundle or version does not exist.
|
|
15
|
-
|
|
16
|
-
Fix:
|
|
17
|
-
- Check the --bundle-name value
|
|
18
|
-
- Run \`transcend policy bundles\` to see available bundles
|
|
19
|
-
- Run \`transcend policy versions --bundle-name=<name>\` to see available versions`;case 400:return t??`The request was invalid. Check your command flags and try again.`;case 409:return t??`The request conflicted with the current policy bundle state.`;case 413:return t??`Policy bundle upload is too large (413 Payload Too Large).
|
|
20
|
-
|
|
21
|
-
Uploaded bundles must be at most 5 KiB compressed and 50 KiB decompressed gzip tarballs containing only .manifest and .rego files.
|
|
22
|
-
|
|
23
|
-
Fix:
|
|
24
|
-
- Remove unnecessary files from the bundle directory before publishing
|
|
25
|
-
- Ensure the compiled .tar.gz stays within the upload limits`;case 429:return s(t,n);default:return e>=500?`Transcend server error (${e}). Try again in a few moments. If the problem persists, contact Transcend support.`:t??`Request failed with status code ${e}.`}}function l(e){if(!(e instanceof Error))return!1;let t=e.code;if(t===`ECONNREFUSED`||t===`ENOTFOUND`||t===`ETIMEDOUT`||t===`ECONNRESET`)return!0;let n=e.message.toLowerCase();return n.includes(`network`)||n.includes(`timeout`)||n.includes(`econnrefused`)||n.includes(`enotfound`)||n.includes(`etimedout`)}function u(e){if(l(e))return`Connection to Transcend failed.
|
|
26
|
-
|
|
27
|
-
The Policy Engine API could not be reached.
|
|
28
|
-
|
|
29
|
-
Fix:
|
|
30
|
-
- Check your network connection
|
|
31
|
-
- Confirm --transcend-url points at the correct environment
|
|
32
|
-
- Retry the command in a few moments`;if(e&&typeof e==`object`&&`response`in e){let t=e.response,n=t?.statusCode,r=a(t?.body);if(n)return c(n,r,t?.headers);if(r)return r}return e instanceof Error?e.message:String(e)}function d(t){throw new e(u(t),{cause:t})}async function f(e){try{return await e}catch(e){d(e)}}function p(e,t){if(t.json){e.write(`${JSON.stringify(t.data,null,2)}\n`);return}t.renderTable&&e.write(`${t.renderTable()}\n`)}export{n as a,i,f as n,r as o,d as r,p as t};
|
|
33
|
-
//# sourceMappingURL=printResult-C2K9ODeE.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"printResult-C2K9ODeE.mjs","names":[],"sources":["../src/commands/policy/constants.ts","../src/commands/policy/helpers/buildPolicyEngineClient.ts","../src/commands/policy/helpers/formatPolicyEngineRequestError.ts","../src/commands/policy/helpers/printResult.ts"],"sourcesContent":["/** Maximum compressed policy bundle upload size in bytes (5 KiB). */\nexport const MAX_BUNDLE_COMPRESSED_BYTES = 5120;\n\n/** Maximum decompressed policy bundle size enforced by the server (50 KiB). */\nexport const MAX_BUNDLE_DECOMPRESSED_BYTES = 51200;\n\n/** Placeholder for nullable API fields in table output. */\nexport const EMPTY_CELL = '-';\n","import got, { type Got } from 'got';\n\n/**\n * Creates a got client for Policy Engine REST endpoints on the monolith.\n *\n * The CLI appends `v1/...` paths to this base URL, so callers must NOT include\n * a trailing `/v1` (that would produce `/v1/v1/...` and an opaque `400`). We\n * detect and reject that mistake with a clear hint.\n *\n * @param transcendUrl - Transcend API base URL (without `/v1`)\n * @param auth - Transcend API key\n * @returns Configured got instance\n */\nexport function buildPolicyEngineClient(transcendUrl: string, auth: string): Got {\n const normalized = transcendUrl.replace(/\\/$/, '');\n if (/(^|\\/)v1$/i.test(normalized)) {\n throw new Error(\n `--transcend-url must not include a trailing \"/v1\" (the CLI appends it automatically). ` +\n `Got \"${transcendUrl}\"; use \"${normalized.replace(/\\/v1$/i, '')}\" instead.`,\n );\n }\n return got.extend({\n prefixUrl: normalized,\n headers: {\n Authorization: `Bearer ${auth}`,\n accept: 'application/json',\n },\n });\n}\n","import { PolicyEngineCliError } from './policyEngineCliError.js';\n\n/** Parsed JSON error body from a Policy Engine API response. */\ninterface PolicyEngineErrorBody {\n /** Human-readable error message */\n message?: string;\n}\n\n/** HTTP response metadata on a got HTTPError. */\ninterface PolicyEngineHttpResponse {\n /** HTTP status code */\n statusCode?: number;\n /** Response body (JSON or raw text) */\n body?: unknown;\n /** Response headers */\n headers?: Record<string, string | string[] | undefined>;\n}\n\n/** Shape of a got HTTPError with response metadata. */\ninterface PolicyEngineHttpError {\n /** HTTP response metadata */\n response?: PolicyEngineHttpResponse;\n}\n\nconst AUTH_ERROR_MESSAGE = `Authentication failed (401 Unauthorized).\n\nYour Transcend API key is missing, invalid, or does not have permission for this command.\n\nFix:\n- Set a valid API key: export TRANSCEND_API_KEY=<your-key>\n or pass --auth=<your-key>\n- Ensure the key has the required Policy Engine scopes (e.g. View/Manage/Activate Policy)\n- Confirm you are pointing at the correct environment (--transcend-url)`;\n\nconst NOT_FOUND_MESSAGE = `Resource not found (404 Not Found).\n\nThe requested policy bundle or version does not exist.\n\nFix:\n- Check the --bundle-name value\n- Run \\`transcend policy bundles\\` to see available bundles\n- Run \\`transcend policy versions --bundle-name=<name>\\` to see available versions`;\n\nconst PAYLOAD_TOO_LARGE_MESSAGE = `Policy bundle upload is too large (413 Payload Too Large).\n\nUploaded bundles must be at most 5 KiB compressed and 50 KiB decompressed gzip tarballs containing only .manifest and .rego files.\n\nFix:\n- Remove unnecessary files from the bundle directory before publishing\n- Ensure the compiled .tar.gz stays within the upload limits`;\n\nconst NETWORK_ERROR_MESSAGE = `Connection to Transcend failed.\n\nThe Policy Engine API could not be reached.\n\nFix:\n- Check your network connection\n- Confirm --transcend-url points at the correct environment\n- Retry the command in a few moments`;\n\n/**\n * Extracts a human-readable message from a Policy Engine API error body.\n *\n * @param body - Raw or parsed response body\n * @returns API message when present\n */\nfunction extractApiMessage(body: unknown): string | undefined {\n if (typeof body === 'string') {\n try {\n const parsed = JSON.parse(body) as PolicyEngineErrorBody;\n return parsed.message;\n } catch {\n return body.length > 0 ? body : undefined;\n }\n }\n\n if (body && typeof body === 'object' && 'message' in body) {\n const message = (body as PolicyEngineErrorBody).message;\n if (typeof message === 'string' && message.length > 0) {\n return message;\n }\n }\n\n return undefined;\n}\n\n/**\n * Reads a single response header value.\n *\n * @param headers - Response headers\n * @param name - Header name\n * @returns Header value when present\n */\nfunction readResponseHeader(\n headers: Record<string, string | string[] | undefined> | undefined,\n name: string,\n): string | undefined {\n if (!headers) {\n return undefined;\n }\n\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) {\n return value[0];\n }\n\n return value;\n}\n\n/**\n * Builds a rate-limit error message using response headers when available.\n *\n * @param apiMessage - Message from the response body, when present\n * @param headers - Response headers\n * @returns User-readable rate-limit text\n */\nfunction formatRateLimitMessage(\n apiMessage: string | undefined,\n headers: Record<string, string | string[] | undefined> | undefined,\n): string {\n if (apiMessage) {\n return apiMessage;\n }\n\n const retryAfter = readResponseHeader(headers, 'retry-after');\n const resetAt = readResponseHeader(headers, 'x-ratelimit-reset');\n\n let message = `Rate limit exceeded (429 Too Many Requests).\n\nFix:\n- Wait and retry the command`;\n\n if (retryAfter) {\n message += `\\n- Retry after ${retryAfter} second(s)`;\n } else if (resetAt) {\n message += `\\n- Retry after ${resetAt}`;\n }\n\n return message;\n}\n\n/**\n * Maps common HTTP status codes to actionable CLI messages.\n *\n * @param statusCode - HTTP status code\n * @param apiMessage - Message from the API response body, when present\n * @param headers - Response headers\n * @returns User-readable error text\n */\nfunction formatHttpStatusError(\n statusCode: number,\n apiMessage?: string,\n headers?: Record<string, string | string[] | undefined>,\n): string {\n switch (statusCode) {\n case 401:\n return AUTH_ERROR_MESSAGE;\n case 403:\n return (\n apiMessage ??\n 'Access was denied (403 Forbidden). If this persists, contact your Transcend admin.'\n );\n case 404:\n return NOT_FOUND_MESSAGE;\n case 400:\n return apiMessage ?? 'The request was invalid. Check your command flags and try again.';\n case 409:\n return apiMessage ?? 'The request conflicted with the current policy bundle state.';\n case 413:\n return apiMessage ?? PAYLOAD_TOO_LARGE_MESSAGE;\n case 429:\n return formatRateLimitMessage(apiMessage, headers);\n default:\n if (statusCode >= 500) {\n return `Transcend server error (${statusCode}). Try again in a few moments. If the problem persists, contact Transcend support.`;\n }\n return apiMessage ?? `Request failed with status code ${statusCode}.`;\n }\n}\n\n/**\n * Returns true when the error looks like a network or timeout failure.\n *\n * @param error - Thrown error\n * @returns Whether the error is likely a connectivity issue\n */\nfunction isNetworkError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const code = (error as NodeJS.ErrnoException).code;\n if (\n code === 'ECONNREFUSED' ||\n code === 'ENOTFOUND' ||\n code === 'ETIMEDOUT' ||\n code === 'ECONNRESET'\n ) {\n return true;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('econnrefused') ||\n message.includes('enotfound') ||\n message.includes('etimedout')\n );\n}\n\n/**\n * Extracts a useful error message from a failed Policy Engine HTTP request.\n *\n * @param error - The thrown error, typically a got `HTTPError`\n * @returns A message suitable for CLI output\n */\nexport function formatPolicyEngineRequestError(error: unknown): string {\n if (isNetworkError(error)) {\n return NETWORK_ERROR_MESSAGE;\n }\n\n if (error && typeof error === 'object' && 'response' in error) {\n const response = (error as PolicyEngineHttpError).response;\n const statusCode = response?.statusCode;\n const apiMessage = extractApiMessage(response?.body);\n\n if (statusCode) {\n return formatHttpStatusError(statusCode, apiMessage, response?.headers);\n }\n\n if (apiMessage) {\n return apiMessage;\n }\n }\n\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Rethrows a Policy Engine request failure with a user-readable message.\n *\n * @param error - The thrown error, typically a got `HTTPError`\n */\nexport function throwPolicyEngineRequestError(error: unknown): never {\n throw new PolicyEngineCliError(formatPolicyEngineRequestError(error), { cause: error });\n}\n\n/**\n * Awaits a Policy Engine HTTP request and maps failures to user-readable errors.\n *\n * @param request - Promise returned by a got client call (e.g. `.json()`)\n * @returns Parsed response body\n */\nexport async function policyEngineRequest<T>(request: Promise<T>): Promise<T> {\n try {\n return await request;\n } catch (error) {\n throwPolicyEngineRequestError(error);\n }\n}\n","/** Options for printing CLI command output. */\nexport interface PrintResultOptions {\n /** When true, print raw JSON */\n json: boolean;\n /** JSON-serializable payload */\n data: unknown;\n /** Table renderer used when json is false */\n renderTable?: () => string;\n}\n\n/**\n * Prints JSON or a human-readable table to stdout.\n *\n * @param stdout - Process stdout stream\n * @param options - Output options\n */\nexport function printResult(stdout: NodeJS.WriteStream, options: PrintResultOptions): void {\n if (options.json) {\n stdout.write(`${JSON.stringify(options.data, null, 2)}\\n`);\n return;\n }\n\n if (options.renderTable) {\n stdout.write(`${options.renderTable()}\\n`);\n }\n}\n"],"mappings":"2EACA,MAAa,EAA8B,KAG9B,EAAgC,MCS7C,SAAgB,EAAwB,EAAsB,EAAmB,CAC/E,IAAM,EAAa,EAAa,QAAQ,MAAO,GAAG,CAClD,GAAI,aAAa,KAAK,EAAW,CAC/B,MAAU,MACR,8FACU,EAAa,UAAU,EAAW,QAAQ,SAAU,GAAG,CAAC,YACnE,CAEH,OAAO,EAAI,OAAO,CAChB,UAAW,EACX,QAAS,CACP,cAAe,UAAU,IACzB,OAAQ,mBACT,CACF,CAAC,CCuCJ,SAAS,EAAkB,EAAmC,CAC5D,GAAI,OAAO,GAAS,SAClB,GAAI,CAEF,OADe,KAAK,MAAM,EACb,CAAC,aACR,CACN,OAAO,EAAK,OAAS,EAAI,EAAO,IAAA,GAIpC,GAAI,GAAQ,OAAO,GAAS,UAAY,YAAa,EAAM,CACzD,IAAM,EAAW,EAA+B,QAChD,GAAI,OAAO,GAAY,UAAY,EAAQ,OAAS,EAClD,OAAO,GAcb,SAAS,EACP,EACA,EACoB,CACpB,GAAI,CAAC,EACH,OAGF,IAAM,EAAQ,EAAQ,IAAS,EAAQ,EAAK,aAAa,EAKzD,OAJI,MAAM,QAAQ,EAAM,CACf,EAAM,GAGR,EAUT,SAAS,EACP,EACA,EACQ,CACR,GAAI,EACF,OAAO,EAGT,IAAM,EAAa,EAAmB,EAAS,cAAc,CACvD,EAAU,EAAmB,EAAS,oBAAoB,CAE5D,EAAU;;;8BAWd,OANI,EACF,GAAW,mBAAmB,EAAW,YAChC,IACT,GAAW,mBAAmB,KAGzB,EAWT,SAAS,EACP,EACA,EACA,EACQ,CACR,OAAQ,EAAR,CACE,IAAK,KACH,MAAO;;;;;;;;yEACT,IAAK,KACH,OACE,GACA,qFAEJ,IAAK,KACH,MAAO;;;;;;;oFACT,IAAK,KACH,OAAO,GAAc,mEACvB,IAAK,KACH,OAAO,GAAc,+DACvB,IAAK,KACH,OAAO,GAAc;;;;;;8DACvB,IAAK,KACH,OAAO,EAAuB,EAAY,EAAQ,CACpD,QAIE,OAHI,GAAc,IACT,2BAA2B,EAAW,oFAExC,GAAc,mCAAmC,EAAW,IAUzE,SAAS,EAAe,EAAyB,CAC/C,GAAI,EAAE,aAAiB,OACrB,MAAO,GAGT,IAAM,EAAQ,EAAgC,KAC9C,GACE,IAAS,gBACT,IAAS,aACT,IAAS,aACT,IAAS,aAET,MAAO,GAGT,IAAM,EAAU,EAAM,QAAQ,aAAa,CAC3C,OACE,EAAQ,SAAS,UAAU,EAC3B,EAAQ,SAAS,UAAU,EAC3B,EAAQ,SAAS,eAAe,EAChC,EAAQ,SAAS,YAAY,EAC7B,EAAQ,SAAS,YAAY,CAUjC,SAAgB,EAA+B,EAAwB,CACrE,GAAI,EAAe,EAAM,CACvB,MAAO;;;;;;;sCAGT,GAAI,GAAS,OAAO,GAAU,UAAY,aAAc,EAAO,CAC7D,IAAM,EAAY,EAAgC,SAC5C,EAAa,GAAU,WACvB,EAAa,EAAkB,GAAU,KAAK,CAEpD,GAAI,EACF,OAAO,EAAsB,EAAY,EAAY,GAAU,QAAQ,CAGzE,GAAI,EACF,OAAO,EAIX,OAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAQ/D,SAAgB,EAA8B,EAAuB,CACnE,MAAM,IAAI,EAAqB,EAA+B,EAAM,CAAE,CAAE,MAAO,EAAO,CAAC,CASzF,eAAsB,EAAuB,EAAiC,CAC5E,GAAI,CACF,OAAO,MAAM,QACN,EAAO,CACd,EAA8B,EAAM,EClPxC,SAAgB,EAAY,EAA4B,EAAmC,CACzF,GAAI,EAAQ,KAAM,CAChB,EAAO,MAAM,GAAG,KAAK,UAAU,EAAQ,KAAM,KAAM,EAAE,CAAC,IAAI,CAC1D,OAGE,EAAQ,aACV,EAAO,MAAM,GAAG,EAAQ,aAAa,CAAC,IAAI"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./constants-BRsj50Nb.mjs";import{t}from"./logger-CPu6zbyQ.mjs";import n from"colors";import{decodeCodec as r}from"@transcend-io/type-utils";import*as i from"io-ts";import{REDUCED_REQUESTS_FOR_DATA_SILO_COUNT as a,buildTranscendGraphQLClient as o,createSombraGotInstance as s,makeGraphQLRequest as c,withTransientRetry as l}from"@transcend-io/sdk";import{mapSeries as u}from"@transcend-io/utils";import d from"cli-progress";async function f(e,{dataSiloId:n}){let{listReducedRequestsForDataSilo:{totalCount:r}}=await c(e,a,{variables:{input:{dataSiloId:n,isResolved:!1}},logger:t});return r}const p=i.type({id:i.string,name:i.string,partition:i.string}),m=i.intersection([i.type({identifier:i.string,type:i.string,coreIdentifier:i.string,dataSiloId:i.string,requestId:i.string,nonce:i.string,requestCreatedAt:i.string,daysUntilOverdue:i.number,attributes:i.array(i.type({key:i.string,values:i.array(i.string)}))}),i.partial({partition:i.union([p,i.null])})]);async function h(e,{dataSiloId:n,limit:a=100,offset:o=0,requestType:s}){try{let c=await l(`pullCronPageOfIdentifiers`,()=>e.get(`v1/data-silo/${n}/pending-requests/${s}`,{searchParams:{offset:o,limit:a}}).json(),{logger:t,maxAttempts:6,baseDelayMs:500}),{items:u}=r(i.type({items:i.array(m)}),c);return u}catch(e){throw Error(`Received an error from server: ${e?.response?.body||e?.message}`)}}async function g({dataSiloId:r,auth:i,sombraAuth:a,actions:c,apiPageSize:l=100,savePageSize:p=1e3,onSave:m,transcendUrl:g=e,skipRequestCount:_=!1}){if(p%l!==0)throw Error(`savePageSize must be a multiple of apiPageSize. savePageSize: ${p}, apiPageSize: ${l}`);let v=await s(g,i,{logger:t,sombraApiKey:a,sombraUrl:process.env.SOMBRA_URL}),y=o(g,i),b=0;_||(b=await f(y,{dataSiloId:r})),t.info(n.magenta(`Pulling ${_?`all`:b} outstanding request identifiers for data silo: "${r}" for requests of types "${c.join(`", "`)}"`));let x=new Date().getTime(),S=new d.SingleBar({},d.Presets.shades_classic),C=new Set,w=[],T=[];_||S.start(b,0),await u(c,async e=>{let i=0,a=!0;for(;a;){let o=await h(v,{dataSiloId:r,limit:l,offset:i,requestType:e}),s=o.map(t=>(C.add(t.requestId),{...t,action:e})),c=s.map(({attributes:e,partition:t,...n})=>({...n,...t?{partitionId:t.id,partitionName:t.name,partitionKey:t.partition}:{},...e.reduce((e,t)=>Object.assign(e,{[t.key]:t.values.join(`,`)}),{})}));w.push(...s),T.push(...c),T.length>=p&&(await m(T),T=[]),a=o.length===l,i+=l,_?t.info(n.magenta(`Pulled ${o.length} outstanding identifiers for ${C.size} requests`)):S.update(C.size)}}),T.length>0&&await m(T),_||S.stop();let E=new Date().getTime()-x;return t.info(n.green(`Successfully pulled ${w.length} outstanding identifiers from ${C.size} requests in "${E/1e3}" seconds!`)),{identifiers:w}}export{f as a,h as i,m as n,p as r,g as t};
|
|
2
|
-
//# sourceMappingURL=pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./constants-BRsj50Nb.mjs";import{t}from"./logger-CPu6zbyQ.mjs";import{n}from"./readCsv-DNcJ_UfU.mjs";import{o as r}from"./request-BpKyN9Xm.mjs";import{uniq as i}from"lodash-es";import a from"colors";import*as o from"io-ts";import{buildTranscendGraphQLClient as s,createSombraGotInstance as c,makeGraphQLRequest as l}from"@transcend-io/sdk";import{map as u,splitCsvToList as d}from"@transcend-io/utils";const f=`https://app.transcend.io/privacy-requests/incoming-requests/`,p=o.record(o.string,o.string);async function m(e,{id:n,...r},o,s){if(!n){let e=`Request ID must be provided to enricher request.${s?` Found error in row: ${s}`:``}`;throw t.error(a.red(e)),Error(e)}let c=n.toLowerCase(),l=Object.entries(r).reduce((e,[t,n])=>i(d(n)).length===0?e:Object.assign(e,{[t]:i(d(n)).map(e=>({value:t===`email`?e.toLowerCase():e}))}),{});try{return await e.post(`v1/enrich-identifiers`,{headers:{"x-transcend-request-id":c,"x-transcend-enricher-id":o},json:{enrichedIdentifiers:l}}).json(),t.error(a.green(`Successfully enriched request: ${f}${c}`)),!0}catch(e){if(typeof e.response.body==`string`&&e.response.body.includes(`Cannot update a resolved RequestEnricher`))return t.warn(a.magenta(`Skipped enrichment for request: ${f}${c}, request is no longer in the enriching phase.`)),!1;throw t.error(a.red(`Failed to enricher identifiers for request with id: ${f}${c} - ${e.message} - ${e.response.body}`)),e}}async function h({file:i,auth:o,sombraAuth:d,enricherId:f,markSilent:h,concurrency:g=100,transcendUrl:_=e}){let v=await c(_,o,{logger:t,sombraApiKey:d,sombraUrl:process.env.SOMBRA_URL}),y=s(_,o);t.info(a.magenta(`Reading "${i}" from disk`));let b=n(i,p);t.info(a.magenta(`Enriching "${b.length}" privacy requests.`));let x=0,S=0,C=0;if(await u(b,async(e,n)=>{try{h&&(await l(y,r,{variables:{input:{id:e.id,isSilent:!0}},logger:t}),t.info(a.magenta(`Mark request as silent mode - ${e.id}`))),await m(v,e,f,n)?x+=1:S+=1}catch{C+=1}},{concurrency:g}),t.info(a.green(`Successfully notified Transcend! \n Success count: ${x}.`)),S>0&&t.info(a.magenta(`Skipped count: ${S}.`)),C>0)throw t.info(a.red(`Error Count: ${C}.`)),Error(`Failed to enrich: ${C} requests.`);return b.length}export{p as n,m as r,h as t};
|
|
2
|
-
//# sourceMappingURL=pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./printResult-C2K9ODeE.mjs";async function t(t,n){let r=0;for(;;){let i=await e(t.get(`v1/policy-engine/policy-bundles`,{searchParams:{limit:100,offset:r}}).json()),a=i.nodes.find(e=>e.bundleName===n);if(a)return a;if(r+=i.nodes.length,r>=i.totalCount||i.nodes.length===0)return}}async function n(e,n){return(await t(e,n))?.id}export{n,t};
|
|
2
|
-
//# sourceMappingURL=resolveBundleIdByName-Dm_o5_bg.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolveBundleIdByName-Dm_o5_bg.mjs","names":[],"sources":["../src/commands/policy/helpers/resolveBundleIdByName.ts"],"sourcesContent":["import type { Got } from 'got';\n\nimport type { PolicyBundle, PolicyBundleListResponse } from '../types.js';\nimport { policyEngineRequest } from './formatPolicyEngineRequestError.js';\n\n/**\n * Resolves a bundle name to its parent record by scanning offset-paginated listings.\n *\n * @param client - Policy Engine REST client\n * @param bundleName - Bundle name to resolve\n * @returns Matching bundle when found\n */\nexport async function resolveBundleByName(\n client: Got,\n bundleName: string,\n): Promise<PolicyBundle | undefined> {\n const limit = 100;\n let offset = 0;\n\n while (true) {\n const body = await policyEngineRequest(\n client\n .get('v1/policy-engine/policy-bundles', {\n searchParams: { limit, offset },\n })\n .json<PolicyBundleListResponse>(),\n );\n\n const match = body.nodes.find((bundle) => bundle.bundleName === bundleName);\n if (match) {\n return match;\n }\n\n offset += body.nodes.length;\n if (offset >= body.totalCount || body.nodes.length === 0) {\n return undefined;\n }\n }\n}\n\n/**\n * Resolves a bundle name to its UUID by scanning offset-paginated bundle listings.\n *\n * @param client - Policy Engine REST client\n * @param bundleName - Bundle name to resolve\n * @returns Bundle UUID when found\n */\nexport async function resolveBundleIdByName(\n client: Got,\n bundleName: string,\n): Promise<string | undefined> {\n const bundle = await resolveBundleByName(client, bundleName);\n return bundle?.id;\n}\n"],"mappings":"+CAYA,eAAsB,EACpB,EACA,EACmC,CACnC,IACI,EAAS,EAEb,OAAa,CACX,IAAM,EAAO,MAAM,EACjB,EACG,IAAI,kCAAmC,CACtC,aAAc,CAAE,UAAO,SAAQ,CAChC,CAAC,CACD,MAAgC,CACpC,CAEK,EAAQ,EAAK,MAAM,KAAM,GAAW,EAAO,aAAe,EAAW,CAC3E,GAAI,EACF,OAAO,EAIT,GADA,GAAU,EAAK,MAAM,OACjB,GAAU,EAAK,YAAc,EAAK,MAAM,SAAW,EACrD,QAYN,eAAsB,EACpB,EACA,EAC6B,CAE7B,OAAO,MADc,EAAoB,EAAQ,EAAW,GAC7C"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./printResult-C2K9ODeE.mjs";async function t(t,n){let r=[],i;for(;;){let a={limit:100};i&&(a.after=i);let o=await e(t.get(`v1/policy-engine/policy-bundles/${n}/versions`,{searchParams:a}).json());if(r.push(...o.nodes),!o.pageInfo.hasNextPage||!o.pageInfo.endCursor)break;i=o.pageInfo.endCursor}return r}function n(e,t){return new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime()}async function r(e,r,i){let a=await t(e,r);if(a.length===0)throw Error(`No versions found for this policy bundle.`);if(i.version){let e=a.find(e=>e.version===i.version);if(!e)throw Error(`Version "${i.version}" was not found for this policy bundle.`);return e}return a.sort(n)[0]}export{r as t};
|
|
2
|
-
//# sourceMappingURL=resolvePolicyBundleVersion-DRUwe7fA.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolvePolicyBundleVersion-DRUwe7fA.mjs","names":[],"sources":["../src/commands/policy/helpers/resolvePolicyBundleVersion.ts"],"sourcesContent":["import type { Got } from 'got';\n\nimport type { PolicyBundleVersion, PolicyBundleVersionListResponse } from '../types.js';\nimport { policyEngineRequest } from './formatPolicyEngineRequestError.js';\n\n/** Options for resolving a policy bundle version. */\nexport interface ResolvePolicyBundleVersionOptions {\n /** Caller-supplied version label; omitted to pick the latest by createdAt */\n version?: string;\n}\n\n/**\n * Lists all versions for a bundle, following cursor pagination.\n *\n * @param client - Policy Engine REST client\n * @param bundleId - Parent bundle UUID\n * @returns All uploaded versions\n */\nasync function listAllPolicyBundleVersions(\n client: Got,\n bundleId: string,\n): Promise<PolicyBundleVersion[]> {\n const limit = 100;\n const versions: PolicyBundleVersion[] = [];\n let after: string | undefined;\n\n while (true) {\n const searchParams: Record<string, string | number> = { limit };\n if (after) {\n searchParams.after = after;\n }\n\n const body = await policyEngineRequest(\n client\n .get(`v1/policy-engine/policy-bundles/${bundleId}/versions`, {\n searchParams,\n })\n .json<PolicyBundleVersionListResponse>(),\n );\n\n versions.push(...body.nodes);\n\n if (!body.pageInfo.hasNextPage || !body.pageInfo.endCursor) {\n break;\n }\n after = body.pageInfo.endCursor;\n }\n\n return versions;\n}\n\n/**\n * Compares two version records by createdAt, newest first.\n *\n * @param left - First version\n * @param right - Second version\n * @returns Sort order for descending createdAt\n */\nfunction compareVersionsByCreatedAtDesc(\n left: PolicyBundleVersion,\n right: PolicyBundleVersion,\n): number {\n return new Date(right.createdAt).getTime() - new Date(left.createdAt).getTime();\n}\n\n/**\n * Resolves a version label to a version record, or picks the latest by createdAt.\n *\n * @param client - Policy Engine REST client\n * @param bundleId - Parent bundle UUID\n * @param options - Version lookup options\n * @returns Matching or latest version record\n */\nexport async function resolvePolicyBundleVersion(\n client: Got,\n bundleId: string,\n options: ResolvePolicyBundleVersionOptions,\n): Promise<PolicyBundleVersion> {\n const versions = await listAllPolicyBundleVersions(client, bundleId);\n\n if (versions.length === 0) {\n throw new Error('No versions found for this policy bundle.');\n }\n\n if (options.version) {\n const match = versions.find((entry) => entry.version === options.version);\n if (!match) {\n throw new Error(`Version \"${options.version}\" was not found for this policy bundle.`);\n }\n return match;\n }\n\n return versions.sort(compareVersionsByCreatedAtDesc)[0];\n}\n"],"mappings":"+CAkBA,eAAe,EACb,EACA,EACgC,CAChC,IACM,EAAkC,EAAE,CACtC,EAEJ,OAAa,CACX,IAAM,EAAgD,CAAE,UAAO,CAC3D,IACF,EAAa,MAAQ,GAGvB,IAAM,EAAO,MAAM,EACjB,EACG,IAAI,mCAAmC,EAAS,WAAY,CAC3D,eACD,CAAC,CACD,MAAuC,CAC3C,CAID,GAFA,EAAS,KAAK,GAAG,EAAK,MAAM,CAExB,CAAC,EAAK,SAAS,aAAe,CAAC,EAAK,SAAS,UAC/C,MAEF,EAAQ,EAAK,SAAS,UAGxB,OAAO,EAUT,SAAS,EACP,EACA,EACQ,CACR,OAAO,IAAI,KAAK,EAAM,UAAU,CAAC,SAAS,CAAG,IAAI,KAAK,EAAK,UAAU,CAAC,SAAS,CAWjF,eAAsB,EACpB,EACA,EACA,EAC8B,CAC9B,IAAM,EAAW,MAAM,EAA4B,EAAQ,EAAS,CAEpE,GAAI,EAAS,SAAW,EACtB,MAAU,MAAM,4CAA4C,CAG9D,GAAI,EAAQ,QAAS,CACnB,IAAM,EAAQ,EAAS,KAAM,GAAU,EAAM,UAAY,EAAQ,QAAQ,CACzE,GAAI,CAAC,EACH,MAAU,MAAM,YAAY,EAAQ,QAAQ,yCAAyC,CAEvF,OAAO,EAGT,OAAO,EAAS,KAAK,EAA+B,CAAC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./constants-BRsj50Nb.mjs";import{t}from"./logger-CPu6zbyQ.mjs";import{ConsentBundleType as n}from"@transcend-io/privacy-types";import r from"colors";import{buildTranscendGraphQLClient as i,deployConsentManager as a,fetchConsentManagerId as o,updateConsentManagerToLatest as s}from"@transcend-io/sdk";import{mapSeries as c}from"@transcend-io/utils";async function l({auth:l,deploy:u=!1,transcendUrl:d=e,bundleTypes:f=Object.values(n)}){let p=i(d,l),m=await o(p,{logger:t});await c(f,async e=>{t.info(r.magenta(`Update Consent Manager bundle with ID "${m}" and type "${e}" to latest version...`)),await s(p,{input:{id:m,bundleType:e},logger:t}),t.info(r.green(`Updated Consent Manager bundle with ID "${m}" and type "${e}" to latest version!`))}),u&&await c(f,async e=>{t.info(r.magenta(`Deploying Consent Manager bundle with ID "${m}" and type "${e}"...`)),await a(p,{id:m,bundleType:e},{logger:t}),t.info(r.green(`Deployed Consent Manager bundle with ID "${m}" and type "${e}"!`))})}export{l as t};
|
|
2
|
-
//# sourceMappingURL=updateConsentManagerVersionToLatest-DWblAwus.mjs.map
|