checkly 9.5.0 → 10.0.0-prerelease-4f88d60
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 +10 -0
- package/bin/launch.cjs +12 -0
- package/dist/ai-context/context.js +1 -0
- package/dist/ai-context/context.js.map +1 -1
- package/dist/ai-context/onboarding-boilerplate/checkly-config-template.ts +2 -2
- package/dist/ai-context/public-skills/checkly/SKILL.md +34 -5
- package/dist/ai-context/skills-command/references/communicate.md +8 -5
- package/dist/ai-context/skills-command/references/configure-api-checks.md +1 -9
- package/dist/ai-context/skills-command/references/configure-browser-checks.md +1 -8
- package/dist/ai-context/skills-command/references/configure-check-groups.md +1 -0
- package/dist/ai-context/skills-command/references/configure-dns-monitors.md +1 -9
- package/dist/ai-context/skills-command/references/configure-grpc-monitors.md +24 -0
- package/dist/ai-context/skills-command/references/configure-heartbeat-monitors.md +1 -9
- package/dist/ai-context/skills-command/references/configure-icmp-monitors.md +1 -9
- package/dist/ai-context/skills-command/references/configure-multistep-checks.md +1 -9
- package/dist/ai-context/skills-command/references/configure-playwright-checks.md +2 -2
- package/dist/ai-context/skills-command/references/configure-supporting-constructs.md +6 -2
- package/dist/ai-context/skills-command/references/configure-tcp-monitors.md +1 -10
- package/dist/ai-context/skills-command/references/configure-url-monitors.md +1 -10
- package/dist/ai-context/skills-command/references/configure.md +17 -5
- package/dist/ai-context/skills-command/references/initialize.md +11 -3
- package/dist/ai-context/skills-command/references/investigate-checks.md +1 -1
- package/dist/auth/api-key.d.ts +24 -0
- package/dist/auth/api-key.js +104 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/device-flow.d.ts +58 -0
- package/dist/auth/device-flow.js +228 -0
- package/dist/auth/device-flow.js.map +1 -0
- package/dist/auth/index.d.ts +6 -6
- package/dist/auth/index.js +64 -64
- package/dist/auth/index.js.map +1 -1
- package/dist/commands/account/plan.js +1 -1
- package/dist/commands/account/plan.js.map +1 -1
- package/dist/commands/account/usage/projections.d.ts +16 -0
- package/dist/commands/account/usage/projections.js +40 -0
- package/dist/commands/account/usage/projections.js.map +1 -0
- package/dist/commands/account/usage/series.d.ts +7 -3
- package/dist/commands/account/usage/series.js +30 -87
- package/dist/commands/account/usage/series.js.map +1 -1
- package/dist/commands/account/usage/summary.d.ts +4 -1
- package/dist/commands/account/usage/summary.js +19 -27
- package/dist/commands/account/usage/summary.js.map +1 -1
- package/dist/commands/account/usage/term.d.ts +15 -0
- package/dist/commands/account/usage/term.js +32 -0
- package/dist/commands/account/usage/term.js.map +1 -0
- package/dist/commands/account/usage/terms.d.ts +4 -0
- package/dist/commands/account/usage/terms.js +19 -27
- package/dist/commands/account/usage/terms.js.map +1 -1
- package/dist/commands/alert-channels/get.js +2 -1
- package/dist/commands/alert-channels/get.js.map +1 -1
- package/dist/commands/alert-channels/list.js +2 -1
- package/dist/commands/alert-channels/list.js.map +1 -1
- package/dist/commands/alert-channels/logs.js +2 -1
- package/dist/commands/alert-channels/logs.js.map +1 -1
- package/dist/commands/api.js +53 -10
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/assets/download.js +11 -7
- package/dist/commands/assets/download.js.map +1 -1
- package/dist/commands/assets/list.js +2 -3
- package/dist/commands/assets/list.js.map +1 -1
- package/dist/commands/authCommand.d.ts +19 -0
- package/dist/commands/authCommand.js +118 -12
- package/dist/commands/authCommand.js.map +1 -1
- package/dist/commands/baseCommand.d.ts +12 -1
- package/dist/commands/baseCommand.js +24 -5
- package/dist/commands/baseCommand.js.map +1 -1
- package/dist/commands/checks/delete.js +1 -1
- package/dist/commands/checks/delete.js.map +1 -1
- package/dist/commands/checks/run.js +3 -1
- package/dist/commands/checks/run.js.map +1 -1
- package/dist/commands/debug/parse-project.d.ts +1 -0
- package/dist/commands/debug/parse-project.js +5 -2
- package/dist/commands/debug/parse-project.js.map +1 -1
- package/dist/commands/deploy.d.ts +8 -2
- package/dist/commands/deploy.js +735 -274
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/destroy.js +3 -3
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/env/add.js +2 -2
- package/dist/commands/env/add.js.map +1 -1
- package/dist/commands/env/ls.js +2 -1
- package/dist/commands/env/ls.js.map +1 -1
- package/dist/commands/env/pull.js +3 -3
- package/dist/commands/env/pull.js.map +1 -1
- package/dist/commands/env/update.js +2 -2
- package/dist/commands/env/update.js.map +1 -1
- package/dist/commands/import/apply.js +12 -10
- package/dist/commands/import/apply.js.map +1 -1
- package/dist/commands/import/cancel.js +4 -4
- package/dist/commands/import/cancel.js.map +1 -1
- package/dist/commands/import/commit.js +11 -9
- package/dist/commands/import/commit.js.map +1 -1
- package/dist/commands/import/plan.js +82 -62
- package/dist/commands/import/plan.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +62 -41
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +38 -2
- package/dist/commands/login.js +848 -52
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +10 -4
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/pw-test.js +6 -3
- package/dist/commands/pw-test.js.map +1 -1
- package/dist/commands/rca/get.js +1 -1
- package/dist/commands/rca/get.js.map +1 -1
- package/dist/commands/rca/run.js +1 -1
- package/dist/commands/rca/run.js.map +1 -1
- package/dist/commands/skills/index.js +1 -1
- package/dist/commands/skills/index.js.map +1 -1
- package/dist/commands/skills/install.js +12 -12
- package/dist/commands/skills/install.js.map +1 -1
- package/dist/commands/switch.d.ts +10 -1
- package/dist/commands/switch.js +75 -13
- package/dist/commands/switch.js.map +1 -1
- package/dist/commands/sync-playwright.js +5 -10
- package/dist/commands/sync-playwright.js.map +1 -1
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.js +58 -29
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/trigger.d.ts +1 -2
- package/dist/commands/trigger.js +27 -20
- package/dist/commands/trigger.js.map +1 -1
- package/dist/commands/validate.js +1 -0
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/whoami.d.ts +8 -0
- package/dist/commands/whoami.js +57 -6
- package/dist/commands/whoami.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.js +8 -1
- package/dist/constants.js.map +1 -1
- package/dist/constructs/alert-channel-codegen.d.ts +6 -1
- package/dist/constructs/alert-channel-codegen.js +12 -6
- package/dist/constructs/alert-channel-codegen.js.map +1 -1
- package/dist/constructs/alert-channel-subscription.d.ts +1 -0
- package/dist/constructs/alert-channel-subscription.js +4 -0
- package/dist/constructs/alert-channel-subscription.js.map +1 -1
- package/dist/constructs/alert-channel.js +8 -5
- package/dist/constructs/alert-channel.js.map +1 -1
- package/dist/constructs/alert-escalation-policy-codegen.d.ts +7 -0
- package/dist/constructs/alert-escalation-policy-codegen.js +25 -8
- package/dist/constructs/alert-escalation-policy-codegen.js.map +1 -1
- package/dist/constructs/api-assertion.d.ts +0 -2
- package/dist/constructs/api-assertion.js +0 -4
- package/dist/constructs/api-assertion.js.map +1 -1
- package/dist/constructs/api-check-bundle.d.ts +4 -124
- package/dist/constructs/api-check-codegen.js +1 -1
- package/dist/constructs/api-check-codegen.js.map +1 -1
- package/dist/constructs/api-check.d.ts +8 -128
- package/dist/constructs/api-check.js +15 -17
- package/dist/constructs/api-check.js.map +1 -1
- package/dist/constructs/api-request-codegen.js +10 -8
- package/dist/constructs/api-request-codegen.js.map +1 -1
- package/dist/constructs/browser-check-bundle.d.ts +11 -125
- package/dist/constructs/browser-check-bundle.js +5 -1
- package/dist/constructs/browser-check-bundle.js.map +1 -1
- package/dist/constructs/browser-check.d.ts +5 -107
- package/dist/constructs/browser-check.js +1 -1
- package/dist/constructs/browser-check.js.map +1 -1
- package/dist/constructs/check-codegen.d.ts +46 -14
- package/dist/constructs/check-codegen.js +118 -34
- package/dist/constructs/check-codegen.js.map +1 -1
- package/dist/constructs/check-group-codegen.js +23 -9
- package/dist/constructs/check-group-codegen.js.map +1 -1
- package/dist/constructs/check-group-v1.d.ts +28 -16
- package/dist/constructs/check-group-v1.js +48 -17
- package/dist/constructs/check-group-v1.js.map +1 -1
- package/dist/constructs/check-group-v2.d.ts +2 -21
- package/dist/constructs/check-group-v2.js +4 -4
- package/dist/constructs/check-group-v2.js.map +1 -1
- package/dist/constructs/check.d.ts +68 -220
- package/dist/constructs/check.js +106 -37
- package/dist/constructs/check.js.map +1 -1
- package/dist/constructs/construct-codegen.d.ts +1 -2
- package/dist/constructs/construct-diagnostics.d.ts +3 -0
- package/dist/constructs/construct-diagnostics.js +11 -0
- package/dist/constructs/construct-diagnostics.js.map +1 -1
- package/dist/constructs/construct.d.ts +30 -4
- package/dist/constructs/construct.js +52 -6
- package/dist/constructs/construct.js.map +1 -1
- package/dist/constructs/dashboard.js +11 -7
- package/dist/constructs/dashboard.js.map +1 -1
- package/dist/constructs/dns-monitor.d.ts +4 -100
- package/dist/constructs/dns-request-codegen.js +1 -1
- package/dist/constructs/dns-request-codegen.js.map +1 -1
- package/dist/constructs/email-alert-channel-codegen.js +1 -1
- package/dist/constructs/email-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/engine.d.ts +4 -2
- package/dist/constructs/engine.js +3 -1
- package/dist/constructs/engine.js.map +1 -1
- package/dist/constructs/frequency-codegen.js +10 -2
- package/dist/constructs/frequency-codegen.js.map +1 -1
- package/dist/constructs/frequency.d.ts +8 -3
- package/dist/constructs/frequency.js +7 -2
- package/dist/constructs/frequency.js.map +1 -1
- package/dist/constructs/grpc-monitor.d.ts +4 -100
- package/dist/constructs/grpc-monitor.js +19 -0
- package/dist/constructs/grpc-monitor.js.map +1 -1
- package/dist/constructs/grpc-request-codegen.js +13 -4
- package/dist/constructs/grpc-request-codegen.js.map +1 -1
- package/dist/constructs/grpc-request.d.ts +23 -0
- package/dist/constructs/heartbeat-monitor.d.ts +2 -1
- package/dist/constructs/heartbeat-monitor.js +2 -2
- package/dist/constructs/heartbeat-monitor.js.map +1 -1
- package/dist/constructs/icmp-monitor.d.ts +4 -100
- package/dist/constructs/icmp-request-codegen.js +1 -1
- package/dist/constructs/icmp-request-codegen.js.map +1 -1
- package/dist/constructs/incidentio-alert-channel-codegen.d.ts +1 -1
- package/dist/constructs/incidentio-alert-channel-codegen.js +14 -8
- package/dist/constructs/incidentio-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/index.d.ts +1 -1
- package/dist/constructs/index.js +1 -1
- package/dist/constructs/index.js.map +1 -1
- package/dist/constructs/internal/assertion-validation.js +1 -2
- package/dist/constructs/internal/assertion-validation.js.map +1 -1
- package/dist/constructs/internal/codegen/context.d.ts +73 -6
- package/dist/constructs/internal/codegen/context.js +78 -6
- package/dist/constructs/internal/codegen/context.js.map +1 -1
- package/dist/constructs/internal/codegen/index.d.ts +3 -1
- package/dist/constructs/internal/codegen/index.js +2 -1
- package/dist/constructs/internal/codegen/index.js.map +1 -1
- package/dist/constructs/internal/codegen/render.d.ts +68 -0
- package/dist/constructs/internal/codegen/render.js +75 -0
- package/dist/constructs/internal/codegen/render.js.map +1 -0
- package/dist/constructs/internal/common-diagnostics.d.ts +1 -2
- package/dist/constructs/internal/common-diagnostics.js +7 -17
- package/dist/constructs/internal/common-diagnostics.js.map +1 -1
- package/dist/constructs/internal/declaring-file.d.ts +39 -0
- package/dist/constructs/internal/declaring-file.js +139 -0
- package/dist/constructs/internal/declaring-file.js.map +1 -0
- package/dist/constructs/internal/default-retry-strategy.d.ts +9 -0
- package/dist/constructs/internal/default-retry-strategy.js +13 -0
- package/dist/constructs/internal/default-retry-strategy.js.map +1 -0
- package/dist/constructs/internal/retry-strategy-defaults.d.ts +13 -0
- package/dist/constructs/internal/retry-strategy-defaults.js +14 -0
- package/dist/constructs/internal/retry-strategy-defaults.js.map +1 -0
- package/dist/constructs/key-value-pair-codegen.d.ts +6 -1
- package/dist/constructs/key-value-pair-codegen.js +24 -3
- package/dist/constructs/key-value-pair-codegen.js.map +1 -1
- package/dist/constructs/maintenance-window-codegen.d.ts +7 -0
- package/dist/constructs/maintenance-window-codegen.js +36 -19
- package/dist/constructs/maintenance-window-codegen.js.map +1 -1
- package/dist/constructs/maintenance-window.d.ts +37 -3
- package/dist/constructs/maintenance-window.js +34 -1
- package/dist/constructs/maintenance-window.js.map +1 -1
- package/dist/constructs/monitor.d.ts +6 -119
- package/dist/constructs/monitor.js +3 -5
- package/dist/constructs/monitor.js.map +1 -1
- package/dist/constructs/msteams-alert-channel-codegen.d.ts +1 -1
- package/dist/constructs/msteams-alert-channel-codegen.js +8 -18
- package/dist/constructs/msteams-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/multi-step-check-bundle.d.ts +4 -109
- package/dist/constructs/multi-step-check.d.ts +4 -100
- package/dist/constructs/opsgenie-alert-channel-codegen.js +1 -1
- package/dist/constructs/opsgenie-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/pagerduty-alert-channel-codegen.js +1 -1
- package/dist/constructs/pagerduty-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/phone-call-alert-channel-codegen.js +1 -1
- package/dist/constructs/phone-call-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/playwright-check-bundle.d.ts +10 -130
- package/dist/constructs/playwright-check-bundle.js +3 -3
- package/dist/constructs/playwright-check-bundle.js.map +1 -1
- package/dist/constructs/playwright-check-codegen.d.ts +85 -0
- package/dist/constructs/playwright-check-codegen.js +212 -0
- package/dist/constructs/playwright-check-codegen.js.map +1 -0
- package/dist/constructs/playwright-check.d.ts +14 -122
- package/dist/constructs/playwright-check.js +17 -51
- package/dist/constructs/playwright-check.js.map +1 -1
- package/dist/constructs/private-location-check-assignment.d.ts +1 -0
- package/dist/constructs/private-location-check-assignment.js +4 -0
- package/dist/constructs/private-location-check-assignment.js.map +1 -1
- package/dist/constructs/private-location-group-assignment.d.ts +1 -0
- package/dist/constructs/private-location-group-assignment.js +4 -0
- package/dist/constructs/private-location-group-assignment.js.map +1 -1
- package/dist/constructs/private-location.js +3 -1
- package/dist/constructs/private-location.js.map +1 -1
- package/dist/constructs/retry-strategy-codegen.d.ts +7 -1
- package/dist/constructs/retry-strategy-codegen.js +41 -32
- package/dist/constructs/retry-strategy-codegen.js.map +1 -1
- package/dist/constructs/retry-strategy.d.ts +0 -4
- package/dist/constructs/retry-strategy.js +5 -8
- package/dist/constructs/retry-strategy.js.map +1 -1
- package/dist/constructs/session.d.ts +38 -1
- package/dist/constructs/session.js +73 -3
- package/dist/constructs/session.js.map +1 -1
- package/dist/constructs/slack-alert-channel-codegen.js +1 -1
- package/dist/constructs/slack-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/slack-app-alert-channel-codegen.js +1 -1
- package/dist/constructs/slack-app-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/sms-alert-channel-codegen.js +1 -1
- package/dist/constructs/sms-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/ssl-monitor.d.ts +4 -142
- package/dist/constructs/ssl-request-codegen.js +4 -3
- package/dist/constructs/ssl-request-codegen.js.map +1 -1
- package/dist/constructs/status-page-v3-automation-rule-codegen.js +5 -4
- package/dist/constructs/status-page-v3-automation-rule-codegen.js.map +1 -1
- package/dist/constructs/status-page-v3-codegen.js +3 -2
- package/dist/constructs/status-page-v3-codegen.js.map +1 -1
- package/dist/constructs/status-page-v3-component-codegen.js +8 -7
- package/dist/constructs/status-page-v3-component-codegen.js.map +1 -1
- package/dist/constructs/tcp-monitor-codegen.js +3 -2
- package/dist/constructs/tcp-monitor-codegen.js.map +1 -1
- package/dist/constructs/tcp-monitor.d.ts +8 -103
- package/dist/constructs/tcp-monitor.js +3 -2
- package/dist/constructs/tcp-monitor.js.map +1 -1
- package/dist/constructs/telegram-alert-channel-codegen.d.ts +1 -1
- package/dist/constructs/telegram-alert-channel-codegen.js +14 -8
- package/dist/constructs/telegram-alert-channel-codegen.js.map +1 -1
- package/dist/constructs/time-zone.d.ts +24 -0
- package/dist/constructs/time-zone.js +455 -0
- package/dist/constructs/time-zone.js.map +1 -0
- package/dist/constructs/traceroute-monitor.d.ts +4 -100
- package/dist/constructs/traceroute-request-codegen.js +2 -2
- package/dist/constructs/traceroute-request-codegen.js.map +1 -1
- package/dist/constructs/url-monitor-codegen.js +1 -1
- package/dist/constructs/url-monitor-codegen.js.map +1 -1
- package/dist/constructs/url-monitor.d.ts +7 -123
- package/dist/constructs/url-monitor.js +3 -0
- package/dist/constructs/url-monitor.js.map +1 -1
- package/dist/constructs/url-request-codegen.js +4 -3
- package/dist/constructs/url-request-codegen.js.map +1 -1
- package/dist/constructs/webhook-alert-channel-codegen.js +3 -3
- package/dist/constructs/webhook-alert-channel-codegen.js.map +1 -1
- package/dist/formatters/check-result-detail.js +0 -185
- package/dist/formatters/check-result-detail.js.map +1 -1
- package/dist/formatters/render.d.ts +2 -1
- package/dist/formatters/render.js +2 -2
- package/dist/formatters/render.js.map +1 -1
- package/dist/formatters/usage.d.ts +18 -12
- package/dist/formatters/usage.js +285 -245
- package/dist/formatters/usage.js.map +1 -1
- package/dist/help/help-extension.js +2 -1
- package/dist/help/help-extension.js.map +1 -1
- package/dist/helpers/accounts.d.ts +28 -0
- package/dist/helpers/accounts.js +50 -0
- package/dist/helpers/accounts.js.map +1 -0
- package/dist/helpers/activate-account.d.ts +13 -0
- package/dist/helpers/activate-account.js +24 -0
- package/dist/helpers/activate-account.js.map +1 -0
- package/dist/helpers/api-fields.js +3 -2
- package/dist/helpers/api-fields.js.map +1 -1
- package/dist/helpers/cli-mode.d.ts +24 -0
- package/dist/helpers/cli-mode.js +64 -8
- package/dist/helpers/cli-mode.js.map +1 -1
- package/dist/helpers/command-preview.d.ts +44 -0
- package/dist/helpers/command-preview.js +29 -9
- package/dist/helpers/command-preview.js.map +1 -1
- package/dist/helpers/command-style.d.ts +1 -0
- package/dist/helpers/command-style.js +51 -37
- package/dist/helpers/command-style.js.map +1 -1
- package/dist/helpers/flags.d.ts +10 -0
- package/dist/helpers/flags.js +18 -0
- package/dist/helpers/flags.js.map +1 -1
- package/dist/helpers/import-plan-selection.d.ts +1 -1
- package/dist/helpers/import-plan-selection.js +8 -20
- package/dist/helpers/import-plan-selection.js.map +1 -1
- package/dist/helpers/invalid-input-error.d.ts +15 -0
- package/dist/helpers/invalid-input-error.js +17 -0
- package/dist/helpers/invalid-input-error.js.map +1 -0
- package/dist/helpers/number.js +4 -3
- package/dist/helpers/number.js.map +1 -1
- package/dist/helpers/onboarding/boilerplate.js +15 -3
- package/dist/helpers/onboarding/boilerplate.js.map +1 -1
- package/dist/helpers/onboarding/index.d.ts +1 -1
- package/dist/helpers/onboarding/index.js +1 -1
- package/dist/helpers/onboarding/index.js.map +1 -1
- package/dist/helpers/onboarding/messages.d.ts +7 -0
- package/dist/helpers/onboarding/messages.js +14 -0
- package/dist/helpers/onboarding/messages.js.map +1 -1
- package/dist/helpers/onboarding/prompt-display.js +2 -2
- package/dist/helpers/onboarding/prompt-display.js.map +1 -1
- package/dist/helpers/onboarding/prompts-helpers.js +3 -1
- package/dist/helpers/onboarding/prompts-helpers.js.map +1 -1
- package/dist/helpers/onboarding/skill-install.js +4 -4
- package/dist/helpers/onboarding/skill-install.js.map +1 -1
- package/dist/helpers/prompts.d.ts +7 -0
- package/dist/helpers/prompts.js +10 -0
- package/dist/helpers/prompts.js.map +1 -0
- package/dist/helpers/result-assets.js +4 -3
- package/dist/helpers/result-assets.js.map +1 -1
- package/dist/helpers/test-helper.d.ts +14 -0
- package/dist/helpers/test-helper.js +33 -3
- package/dist/helpers/test-helper.js.map +1 -1
- package/dist/helpers/usage.d.ts +51 -14
- package/dist/helpers/usage.js +193 -53
- package/dist/helpers/usage.js.map +1 -1
- package/dist/helpers/wrap.js +1 -1
- package/dist/helpers/wrap.js.map +1 -1
- package/dist/messages/common-messages.d.ts +1 -0
- package/dist/messages/common-messages.js +4 -2
- package/dist/messages/common-messages.js.map +1 -1
- package/dist/reporters/abstract-list.d.ts +9 -2
- package/dist/reporters/abstract-list.js +105 -32
- package/dist/reporters/abstract-list.js.map +1 -1
- package/dist/reporters/ci.js +7 -4
- package/dist/reporters/ci.js.map +1 -1
- package/dist/reporters/dot.d.ts +1 -0
- package/dist/reporters/dot.js +19 -7
- package/dist/reporters/dot.js.map +1 -1
- package/dist/reporters/github.d.ts +2 -0
- package/dist/reporters/github.js +29 -4
- package/dist/reporters/github.js.map +1 -1
- package/dist/reporters/json.d.ts +2 -0
- package/dist/reporters/json.js +27 -4
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/list.js +10 -8
- package/dist/reporters/list.js.map +1 -1
- package/dist/reporters/reporter.d.ts +1 -0
- package/dist/reporters/reporter.js.map +1 -1
- package/dist/reporters/util.d.ts +5 -2
- package/dist/reporters/util.js +25 -61
- package/dist/reporters/util.js.map +1 -1
- package/dist/rest/analytics.js +0 -4
- package/dist/rest/analytics.js.map +1 -1
- package/dist/rest/api.d.ts +10 -1
- package/dist/rest/api.js +44 -9
- package/dist/rest/api.js.map +1 -1
- package/dist/rest/check-results.d.ts +1 -50
- package/dist/rest/check-results.js.map +1 -1
- package/dist/rest/checkly-storage.d.ts +6 -1
- package/dist/rest/checkly-storage.js +13 -2
- package/dist/rest/checkly-storage.js.map +1 -1
- package/dist/rest/errors.d.ts +19 -0
- package/dist/rest/errors.js +20 -1
- package/dist/rest/errors.js.map +1 -1
- package/dist/rest/projects.d.ts +254 -4
- package/dist/rest/projects.js +208 -17
- package/dist/rest/projects.js.map +1 -1
- package/dist/rest/usage.d.ts +164 -73
- package/dist/rest/usage.js +21 -10
- package/dist/rest/usage.js.map +1 -1
- package/dist/services/abstract-check-runner.d.ts +34 -2
- package/dist/services/abstract-check-runner.js +183 -56
- package/dist/services/abstract-check-runner.js.map +1 -1
- package/dist/services/check-parser/bundler.d.ts +26 -0
- package/dist/services/check-parser/bundler.js +81 -7
- package/dist/services/check-parser/bundler.js.map +1 -1
- package/dist/services/check-parser/cache-hash.d.ts +1 -4
- package/dist/services/check-parser/cache-hash.js.map +1 -1
- package/dist/services/check-parser/package-files/json-text-source-file.d.ts +0 -2
- package/dist/services/check-parser/package-files/json-text-source-file.js +6 -6
- package/dist/services/check-parser/package-files/json-text-source-file.js.map +1 -1
- package/dist/services/check-parser/parser.d.ts +3 -2
- package/dist/services/check-parser/parser.js +31 -40
- package/dist/services/check-parser/parser.js.map +1 -1
- package/dist/services/checkly-config-codegen.js +4 -4
- package/dist/services/checkly-config-codegen.js.map +1 -1
- package/dist/services/checkly-config-loader.d.ts +18 -33
- package/dist/services/checkly-config-loader.js +50 -47
- package/dist/services/checkly-config-loader.js.map +1 -1
- package/dist/services/config.d.ts +42 -1
- package/dist/services/config.js +93 -9
- package/dist/services/config.js.map +1 -1
- package/dist/services/content-hash.d.ts +14 -0
- package/dist/services/content-hash.js +22 -0
- package/dist/services/content-hash.js.map +1 -0
- package/dist/services/deploy-diff/diff-lines.d.ts +52 -0
- package/dist/services/deploy-diff/diff-lines.js +327 -0
- package/dist/services/deploy-diff/diff-lines.js.map +1 -0
- package/dist/services/deploy-diff/double-check.d.ts +9 -0
- package/dist/services/deploy-diff/double-check.js +21 -0
- package/dist/services/deploy-diff/double-check.js.map +1 -0
- package/dist/services/deploy-diff/import-shape.d.ts +171 -0
- package/dist/services/deploy-diff/import-shape.js +633 -0
- package/dist/services/deploy-diff/import-shape.js.map +1 -0
- package/dist/services/deploy-diff/legacy-payload.d.ts +22 -0
- package/dist/services/deploy-diff/legacy-payload.js +51 -0
- package/dist/services/deploy-diff/legacy-payload.js.map +1 -0
- package/dist/services/deploy-diff/plan-summary.d.ts +81 -0
- package/dist/services/deploy-diff/plan-summary.js +262 -0
- package/dist/services/deploy-diff/plan-summary.js.map +1 -0
- package/dist/services/deploy-diff/preview-output.d.ts +63 -0
- package/dist/services/deploy-diff/preview-output.js +403 -0
- package/dist/services/deploy-diff/preview-output.js.map +1 -0
- package/dist/services/deploy-diff/render.d.ts +59 -0
- package/dist/services/deploy-diff/render.js +326 -0
- package/dist/services/deploy-diff/render.js.map +1 -0
- package/dist/services/deploy-diff/shape-changes.d.ts +2 -0
- package/dist/services/deploy-diff/shape-changes.js +48 -0
- package/dist/services/deploy-diff/shape-changes.js.map +1 -0
- package/dist/services/deploy-diff/source-index.d.ts +18 -0
- package/dist/services/deploy-diff/source-index.js +48 -0
- package/dist/services/deploy-diff/source-index.js.map +1 -0
- package/dist/services/deploy-diff/variable-names.d.ts +30 -0
- package/dist/services/deploy-diff/variable-names.js +64 -0
- package/dist/services/deploy-diff/variable-names.js.map +1 -0
- package/dist/services/engine-resolver.js +3 -0
- package/dist/services/engine-resolver.js.map +1 -1
- package/dist/services/engine-rules-loader.d.ts +6 -0
- package/dist/services/engine-rules-loader.js +12 -3
- package/dist/services/engine-rules-loader.js.map +1 -1
- package/dist/services/oxc-parser.d.ts +26 -0
- package/dist/services/oxc-parser.js +70 -0
- package/dist/services/oxc-parser.js.map +1 -0
- package/dist/services/project-cli.d.ts +75 -0
- package/dist/services/project-cli.js +302 -0
- package/dist/services/project-cli.js.map +1 -0
- package/dist/services/project-parser.d.ts +5 -0
- package/dist/services/project-parser.js +25 -13
- package/dist/services/project-parser.js.map +1 -1
- package/dist/services/skills.js +3 -3
- package/dist/services/skills.js.map +1 -1
- package/dist/services/snapshot-service.d.ts +25 -8
- package/dist/services/snapshot-service.js +46 -4
- package/dist/services/snapshot-service.js.map +1 -1
- package/dist/services/socket-client.js +1 -1
- package/dist/services/socket-client.js.map +1 -1
- package/dist/services/test-filters.d.ts +18 -0
- package/dist/services/test-filters.js +10 -0
- package/dist/services/test-filters.js.map +1 -1
- package/dist/services/test-runner.d.ts +1 -1
- package/dist/services/test-runner.js +10 -11
- package/dist/services/test-runner.js.map +1 -1
- package/dist/services/test-session-cancel.d.ts +5 -0
- package/dist/services/test-session-cancel.js +28 -3
- package/dist/services/test-session-cancel.js.map +1 -1
- package/dist/services/trigger-runner.d.ts +1 -1
- package/dist/services/trigger-runner.js +2 -2
- package/dist/services/trigger-runner.js.map +1 -1
- package/dist/services/two-installs.d.ts +39 -0
- package/dist/services/two-installs.js +155 -0
- package/dist/services/two-installs.js.map +1 -0
- package/dist/services/util.d.ts +17 -2
- package/dist/services/util.js +118 -11
- package/dist/services/util.js.map +1 -1
- package/dist/services/write-back/apply-edits.d.ts +29 -0
- package/dist/services/write-back/apply-edits.js +255 -0
- package/dist/services/write-back/apply-edits.js.map +1 -0
- package/dist/services/write-back/helper-edit.d.ts +135 -0
- package/dist/services/write-back/helper-edit.js +343 -0
- package/dist/services/write-back/helper-edit.js.map +1 -0
- package/dist/services/write-back/imports.d.ts +30 -0
- package/dist/services/write-back/imports.js +88 -0
- package/dist/services/write-back/imports.js.map +1 -0
- package/dist/services/write-back/literal-edit.d.ts +183 -0
- package/dist/services/write-back/literal-edit.js +359 -0
- package/dist/services/write-back/literal-edit.js.map +1 -0
- package/dist/services/write-back/output.d.ts +26 -0
- package/dist/services/write-back/output.js +110 -0
- package/dist/services/write-back/output.js.map +1 -0
- package/dist/services/write-back/plan.d.ts +180 -0
- package/dist/services/write-back/plan.js +1046 -0
- package/dist/services/write-back/plan.js.map +1 -0
- package/dist/services/write-back/source-file.d.ts +133 -0
- package/dist/services/write-back/source-file.js +460 -0
- package/dist/services/write-back/source-file.js.map +1 -0
- package/dist/sourcegen/index.d.ts +1 -1
- package/dist/sourcegen/index.js +1 -1
- package/dist/sourcegen/index.js.map +1 -1
- package/dist/sourcegen/program.d.ts +19 -1
- package/dist/sourcegen/program.js +32 -7
- package/dist/sourcegen/program.js.map +1 -1
- package/dist/testing/clear-git-env.d.ts +1 -0
- package/dist/testing/clear-git-env.js +25 -0
- package/dist/testing/clear-git-env.js.map +1 -0
- package/dist/testing/global-setup.d.ts +1 -0
- package/dist/testing/global-setup.js +3 -0
- package/dist/testing/global-setup.js.map +1 -1
- package/oclif.manifest.json +1113 -884
- package/package.json +21 -19
- package/dist/commands/rules.d.ts +0 -9
- package/dist/commands/rules.js +0 -13
- package/dist/commands/rules.js.map +0 -1
- package/dist/constructs/agentic-check-codegen.d.ts +0 -22
- package/dist/constructs/agentic-check-codegen.js +0 -59
- package/dist/constructs/agentic-check-codegen.js.map +0 -1
- package/dist/constructs/agentic-check.d.ts +0 -237
- package/dist/constructs/agentic-check.js +0 -100
- package/dist/constructs/agentic-check.js.map +0 -1
- package/dist/services/check-parser/package-files/json-text-source-file-parser.d.ts +0 -7
- package/dist/services/check-parser/package-files/json-text-source-file-parser.js +0 -47
- package/dist/services/check-parser/package-files/json-text-source-file-parser.js.map +0 -1
- package/dist/services/check-parser/package-files/source-file-parser.d.ts +0 -10
- package/dist/services/check-parser/package-files/source-file-parser.js +0 -13
- package/dist/services/check-parser/package-files/source-file-parser.js.map +0 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { ConstructCodegen } from '../../constructs/construct-codegen.js';
|
|
3
|
+
import { Context, renderConstruct } from '../../constructs/internal/codegen/index.js';
|
|
4
|
+
import { Program } from '../../sourcegen/index.js';
|
|
5
|
+
import { blankRedacted, carriesMarker, fillUnchangedFromBefore, isMaskedMarker, markChanged, MASK, nodeAt, pointerSegments, UNRENDERED_KEYS, registerProject, registerUnderCodeName, relationResourcesForAfter, relationResourcesFromBefore, toImportResource, UnshapeableError, } from './import-shape.js';
|
|
6
|
+
import { isShapeChangePath } from './shape-changes.js';
|
|
7
|
+
import { diffLines } from './diff-lines.js';
|
|
8
|
+
const note = (text) => ({ kind: 'note', text });
|
|
9
|
+
/** The line with its text transformed, whichever kind it is. */
|
|
10
|
+
function mapText(line, fn) {
|
|
11
|
+
if (line.kind === 'nested') {
|
|
12
|
+
return { kind: 'nested', line: { ...line.line, text: fn(line.line.text) } };
|
|
13
|
+
}
|
|
14
|
+
return { ...line, text: fn(line.text) };
|
|
15
|
+
}
|
|
16
|
+
const textOf = (line) => line.kind === 'nested' ? line.line.text : line.text;
|
|
17
|
+
const INLINE_VALUE_CAP = 256;
|
|
18
|
+
/**
|
|
19
|
+
* Properties a codegen writes to a file of its own rather than into the
|
|
20
|
+
* construct — a browser or multi-step check's script to a spec file, an API
|
|
21
|
+
* check's setup and teardown scripts to support files, a dashboard's CSS to
|
|
22
|
+
* a style file — leaving an `entrypoint` path behind. A change to one is
|
|
23
|
+
* invisible in the construct diff and is shown as a text diff of its own,
|
|
24
|
+
* whether or not the constructs differ too.
|
|
25
|
+
*/
|
|
26
|
+
const OUTSIDE_CONSTRUCT = {
|
|
27
|
+
check: new Set(['/script', '/localSetupScript', '/localTearDownScript']),
|
|
28
|
+
dashboard: new Set(['/customCSS']),
|
|
29
|
+
};
|
|
30
|
+
function isOutsideConstruct(type, path) {
|
|
31
|
+
return OUTSIDE_CONSTRUCT[type]?.has(path) ?? false;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Whether a redaction rule reaches the path a secret change names: the two
|
|
35
|
+
* agree segment for segment as far as the shorter goes, a rule's `*` standing
|
|
36
|
+
* for any one segment. A rule under the path blanks inside the list the
|
|
37
|
+
* change reports whole; a rule above it blanks the object that holds it.
|
|
38
|
+
*/
|
|
39
|
+
function ruleReaches(rulePath, changePath) {
|
|
40
|
+
const rule = pointerSegments(rulePath);
|
|
41
|
+
const change = pointerSegments(changePath);
|
|
42
|
+
const shared = Math.min(rule.length, change.length);
|
|
43
|
+
for (let index = 0; index < shared; index += 1) {
|
|
44
|
+
if (rule[index] !== '*' && rule[index] !== change[index]) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
function isHash(value) {
|
|
51
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) && '$hash' in value;
|
|
52
|
+
}
|
|
53
|
+
/** A marker spelled the way the construct prints it. */
|
|
54
|
+
const spellMarker = (_key, member) => (isMaskedMarker(member) ? (member.$masked === 'changed' ? `${MASK} (changed)` : MASK) : member);
|
|
55
|
+
function inline(value) {
|
|
56
|
+
if (value === undefined) {
|
|
57
|
+
return '(absent)';
|
|
58
|
+
}
|
|
59
|
+
if (isHash(value)) {
|
|
60
|
+
return '(content)';
|
|
61
|
+
}
|
|
62
|
+
const text = JSON.stringify(value, spellMarker);
|
|
63
|
+
return text.length > INLINE_VALUE_CAP ? `${text.slice(0, INLINE_VALUE_CAP)}…` : text;
|
|
64
|
+
}
|
|
65
|
+
/** The value at an RFC 6901 pointer, or undefined when the path does not resolve. */
|
|
66
|
+
const valueAt = (root, pointer) => nodeAt(root, pointerSegments(pointer));
|
|
67
|
+
function originNote(change) {
|
|
68
|
+
switch (change.origin) {
|
|
69
|
+
case 'remote':
|
|
70
|
+
return ' (changed in Checkly, overwritten by this deploy)';
|
|
71
|
+
case 'both':
|
|
72
|
+
return ' (also changed in Checkly, overwritten by this deploy)';
|
|
73
|
+
case 'unmanaged':
|
|
74
|
+
return ' (not managed by this project)';
|
|
75
|
+
default:
|
|
76
|
+
return '';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** One change as a line of the listing: path, values, and where it came from. */
|
|
80
|
+
function listChange(change) {
|
|
81
|
+
if (change.cause !== undefined) {
|
|
82
|
+
return `${change.path}: changed (${change.cause})${originNote(change)}`;
|
|
83
|
+
}
|
|
84
|
+
return `${change.path}: ${inline(change.before)} -> ${inline(change.after)}${originNote(change)}`;
|
|
85
|
+
}
|
|
86
|
+
function listing(changes, reason) {
|
|
87
|
+
const lines = reason === undefined ? [] : [{ kind: 'reason', text: `(${reason})` }];
|
|
88
|
+
for (const change of changes) {
|
|
89
|
+
lines.push(note(listChange(change)));
|
|
90
|
+
}
|
|
91
|
+
return lines;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The import codegen, with the rendered construct's own variable named as in
|
|
95
|
+
* the user's code, or else after its logical id, on both sides.
|
|
96
|
+
*/
|
|
97
|
+
class SideCodegen extends ConstructCodegen {
|
|
98
|
+
variableNames;
|
|
99
|
+
constructor(program, variableNames) {
|
|
100
|
+
super(program);
|
|
101
|
+
this.variableNames = variableNames;
|
|
102
|
+
}
|
|
103
|
+
prepare(logicalId, resource, context) {
|
|
104
|
+
super.prepare(logicalId, resource, context);
|
|
105
|
+
registerUnderCodeName(context, resource, this.variableNames);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** A side of the comparison rendered to source text, with its relations registered first. */
|
|
109
|
+
function renderSide(resource, relations, project, ids, maskedValues, variableNames, spelledOut) {
|
|
110
|
+
const program = new Program({
|
|
111
|
+
rootDirectory: '.',
|
|
112
|
+
constructFileSuffix: '.check',
|
|
113
|
+
specFileSuffix: '.spec',
|
|
114
|
+
language: 'typescript',
|
|
115
|
+
});
|
|
116
|
+
const context = new Context({ maskedValues, spelledOut });
|
|
117
|
+
const codegen = new SideCodegen(program, variableNames);
|
|
118
|
+
registerProject(context, program, project, ids, variableNames);
|
|
119
|
+
for (const relation of relations) {
|
|
120
|
+
codegen.prepare(relation.logicalId, relation, context);
|
|
121
|
+
}
|
|
122
|
+
return renderConstruct(codegen, resource.logicalId, resource, { context });
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The text diff of a change whose values are content (a script, a body): the
|
|
126
|
+
* deployed text read from `before` at the same pointer, the local text from
|
|
127
|
+
* the local payload. Either side missing means the pointer is spelled
|
|
128
|
+
* differently in the two vocabularies, and only the fact is reported.
|
|
129
|
+
*/
|
|
130
|
+
function contentDiff(change, before, local, maxLines) {
|
|
131
|
+
const deployed = valueAt(before, change.path);
|
|
132
|
+
const current = valueAt(local, change.path);
|
|
133
|
+
if (typeof deployed !== 'string' || typeof current !== 'string') {
|
|
134
|
+
return [note(`${change.path}: content changed${originNote(change)}`)];
|
|
135
|
+
}
|
|
136
|
+
const lines = diffLines(deployed, current, { maxLines });
|
|
137
|
+
if (lines === undefined) {
|
|
138
|
+
return [note(`${change.path}: content changed (too large to show)${originNote(change)}`)];
|
|
139
|
+
}
|
|
140
|
+
const nested = lines.map((line) => ({ kind: 'nested', line }));
|
|
141
|
+
return [note(`${change.path}:${originNote(change)}`), ...nested];
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Whether every change the entry reports is named by a cause and none is a
|
|
145
|
+
* secret: such an entry is rendered as one `changed: <causes>` notice, with
|
|
146
|
+
* no diff, so it needs no deployed state, and the API sends it none.
|
|
147
|
+
*/
|
|
148
|
+
export function changedByCauseAlone(entry) {
|
|
149
|
+
const changes = entry.changes ?? [];
|
|
150
|
+
return changes.length > 0 && changes.every(change => change.secret !== true && change.cause !== undefined);
|
|
151
|
+
}
|
|
152
|
+
export function renderResourceDiff(input) {
|
|
153
|
+
const { entry, local, localResources, diff, project, ids, ...options } = input;
|
|
154
|
+
const { pruneRelations, variableNames, spelledOut, maxLines } = options;
|
|
155
|
+
const lines = [];
|
|
156
|
+
const changes = entry.changes ?? [];
|
|
157
|
+
// A secret is shown inline, masked, with `(changed)` on the element the
|
|
158
|
+
// report marks; a secret change whose mark could not be placed (no
|
|
159
|
+
// markers reported, an element the payload does not hold, a position the
|
|
160
|
+
// rules blank to null) is named after the block instead, so a secret's
|
|
161
|
+
// movement is visible exactly once. The block is rendered for a secret
|
|
162
|
+
// change even when nothing else is reported, since the API reports the
|
|
163
|
+
// list holding a moved secret whole, plain siblings' edits included.
|
|
164
|
+
const shown = changes.filter(change => change.secret !== true);
|
|
165
|
+
const marked = new Set();
|
|
166
|
+
try {
|
|
167
|
+
lines.push(...renderShown(shown, marked, entry, local, localResources, diff, project, ids, { pruneRelations, variableNames, spelledOut, maxLines }));
|
|
168
|
+
}
|
|
169
|
+
catch (cause) {
|
|
170
|
+
// A payload this CLI cannot shape like an import resource, a codegen that
|
|
171
|
+
// does not cover the type, a script it cannot
|
|
172
|
+
// parse, a construct it refuses: the listing says what changed even when
|
|
173
|
+
// the rendering cannot.
|
|
174
|
+
const reason = cause instanceof UnshapeableError
|
|
175
|
+
? cause.message
|
|
176
|
+
: `could not render this resource: ${cause instanceof Error ? cause.message : cause}`;
|
|
177
|
+
if (shown.length > 0) {
|
|
178
|
+
lines.push(...listing(shown, reason));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
for (const change of changes) {
|
|
182
|
+
if (change.secret !== true) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (!marked.has(change)) {
|
|
186
|
+
lines.push(note(`secret changed: ${change.path}${originNote(change)}`));
|
|
187
|
+
}
|
|
188
|
+
else if (originNote(change) !== '') {
|
|
189
|
+
// The inline mark says which secret moved; the note says the deploy overwrites it.
|
|
190
|
+
lines.push(note(`${change.path}:${originNote(change)}`));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return lines;
|
|
194
|
+
}
|
|
195
|
+
/** The reported side a mark is read from: the local side follows the code's movement, the deployed side the backend's. */
|
|
196
|
+
function reportedFor(change, side) {
|
|
197
|
+
if (side === 'local') {
|
|
198
|
+
return change.origin === 'code' || change.origin === 'both' ? change.after : undefined;
|
|
199
|
+
}
|
|
200
|
+
return change.origin === 'both' ? change.remote?.after : change.origin === 'remote' ? change.after : undefined;
|
|
201
|
+
}
|
|
202
|
+
function renderShown(shown, marked, entry, local, localResources, diff, project, ids, options) {
|
|
203
|
+
const { pruneRelations, variableNames, spelledOut, maxLines } = options;
|
|
204
|
+
// A secret change withholds the list it is in whole, plain siblings' edits
|
|
205
|
+
// included, so the construct diff — both sides blanked — is the only place
|
|
206
|
+
// such an edit shows: an entry with a secret change is rendered even when
|
|
207
|
+
// nothing else is reported, and a cause alone does not stand in for it.
|
|
208
|
+
// Rendered only when a reported rule reaches every secret's path, though:
|
|
209
|
+
// the local side's blanks come from that table, and a gap in it must not
|
|
210
|
+
// print what the API withheld.
|
|
211
|
+
const secrets = (entry.changes ?? []).filter(change => change.secret === true);
|
|
212
|
+
const withSecrets = secrets.length > 0;
|
|
213
|
+
if (shown.length === 0 && !withSecrets) {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
if (changedByCauseAlone(entry)) {
|
|
217
|
+
return [note(`changed: ${[...new Set(shown.map(change => change.cause))].join(', ')}`)];
|
|
218
|
+
}
|
|
219
|
+
// A change that is secret or carries a marker (a reorder of a list holding
|
|
220
|
+
// one) is rendered only when a reported rule reaches its path.
|
|
221
|
+
const guarded = (entry.changes ?? []).filter(change => change.secret === true
|
|
222
|
+
|| carriesMarker(change.before) || carriesMarker(change.after) || carriesMarker(change.remote));
|
|
223
|
+
if (!guarded.every(change => (entry.redactions ?? []).some(rule => ruleReaches(rule.path, change.path)))) {
|
|
224
|
+
return listing(shown);
|
|
225
|
+
}
|
|
226
|
+
if (entry.before === undefined || local === undefined || local.payload === null || local.payload === undefined) {
|
|
227
|
+
return listing(shown);
|
|
228
|
+
}
|
|
229
|
+
const { type, logicalId } = entry;
|
|
230
|
+
// The deployed side is the import format already, straight from the API,
|
|
231
|
+
// less what neither side renders — dropped before the local side is filled
|
|
232
|
+
// from it, so the fill cannot copy it across.
|
|
233
|
+
const before = { ...entry.before };
|
|
234
|
+
for (const key of UNRENDERED_KEYS) {
|
|
235
|
+
delete before[key];
|
|
236
|
+
}
|
|
237
|
+
// Both sides masked by the same rules; the deployed side arrives blanked.
|
|
238
|
+
// A copy, since the marks are written in place and `entry.before` is
|
|
239
|
+
// read again for relations and text diffs.
|
|
240
|
+
const deployed = {
|
|
241
|
+
type: type,
|
|
242
|
+
logicalId,
|
|
243
|
+
payload: blankRedacted(structuredClone(before), entry.redactions),
|
|
244
|
+
};
|
|
245
|
+
// Shaped first, then filled with what the deploy leaves as it is, masked
|
|
246
|
+
// last: the rules are spelled in the import format's vocabulary, which is
|
|
247
|
+
// what the shaped payload is in.
|
|
248
|
+
const shaped = toImportResource(deployed.type, logicalId, local.payload, ids);
|
|
249
|
+
fillUnchangedFromBefore(shaped.payload, before, entry.changes ?? []);
|
|
250
|
+
const after = { ...shaped, payload: blankRedacted(shaped.payload, entry.redactions) };
|
|
251
|
+
// Then the marks: the element whose secret moved reads `(changed)` on the
|
|
252
|
+
// side that moved it, so the diff names the secret beside its key. Each
|
|
253
|
+
// change writes its own sentinel, unguessable by any value the account or
|
|
254
|
+
// the code could hold, so only a change whose sentinel reached the returned
|
|
255
|
+
// lines counts as marked; the sentinels read `(changed)` in the output.
|
|
256
|
+
// The codegen prints a secret only as one of these strings. The two labels
|
|
257
|
+
// end alike (`#<nonce>-<index>)`): a codegen that names a file or variable
|
|
258
|
+
// after the tail of a credential (an unnamed Slack or PagerDuty channel
|
|
259
|
+
// takes the last four characters of its URL or key) then derives the same
|
|
260
|
+
// name on both sides, and the diff stays free of a spurious rename.
|
|
261
|
+
const nonce = randomUUID();
|
|
262
|
+
const sentinels = new Map();
|
|
263
|
+
secrets.forEach((change, index) => {
|
|
264
|
+
const localLabel = `${MASK} (changed#${nonce}-${index})`;
|
|
265
|
+
const deployedLabel = `${MASK} (changed in Checkly#${nonce}-${index})`;
|
|
266
|
+
const onLocal = markChanged(after.payload, change.path, reportedFor(change, 'local'), localLabel);
|
|
267
|
+
const onDeployed = markChanged(deployed.payload, change.path, reportedFor(change, 'deployed'), deployedLabel);
|
|
268
|
+
if (onLocal || onDeployed) {
|
|
269
|
+
sentinels.set(change, { local: localLabel, deployed: deployedLabel });
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
const maskedValues = new Set([MASK, ...[...sentinels.values()].flatMap(pair => [pair.local, pair.deployed])]);
|
|
273
|
+
const showing = (lines) => {
|
|
274
|
+
for (const [change, pair] of sentinels) {
|
|
275
|
+
if (lines.some(line => textOf(line).includes(pair.local) || textOf(line).includes(pair.deployed))) {
|
|
276
|
+
marked.add(change);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const sentinel = new RegExp(` \\(changed( in Checkly)?#${nonce}-\\d+\\)`, 'g');
|
|
280
|
+
return lines.map(line => mapText(line, text => text.replace(sentinel, ' (changed$1)')));
|
|
281
|
+
};
|
|
282
|
+
const afterRelations = relationResourcesForAfter({ ids, local: localResources, entry, diff, pruneRelations });
|
|
283
|
+
const beforeRelations = relationResourcesFromBefore(type, entry.before);
|
|
284
|
+
const beforeText = renderSide(deployed, beforeRelations, project, ids, maskedValues, variableNames, spelledOut);
|
|
285
|
+
const afterText = renderSide(after, afterRelations, project, ids, maskedValues, variableNames, spelledOut);
|
|
286
|
+
const rendered = diffLines(beforeText, afterText, { maxLines, pairProperties: true });
|
|
287
|
+
if (rendered === undefined) {
|
|
288
|
+
return shown.length > 0 ? listing(shown, 'the construct diff is too large to show') : [];
|
|
289
|
+
}
|
|
290
|
+
if (rendered.length > 0) {
|
|
291
|
+
// The constructs differ. What they cannot show follows: a property kept
|
|
292
|
+
// in a file of its own as a text diff, and a change that is only a cause
|
|
293
|
+
// (a new code bundle, a dependency list) as a line.
|
|
294
|
+
const lines = [...rendered];
|
|
295
|
+
for (const change of shown) {
|
|
296
|
+
if (isOutsideConstruct(type, change.path)) {
|
|
297
|
+
lines.push(...contentDiff(change, entry.before, local.payload, maxLines));
|
|
298
|
+
}
|
|
299
|
+
else if (change.cause !== undefined) {
|
|
300
|
+
lines.push(note(listChange(change)));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return showing(lines);
|
|
304
|
+
}
|
|
305
|
+
// The renderings agree. When every change is a known shape change, that is
|
|
306
|
+
// the CLI upgrade spelling the same construct differently; the paths alone
|
|
307
|
+
// cannot tell an upgrade from a user editing the same property, so a real
|
|
308
|
+
// edit shows up as construct lines above and never gets here.
|
|
309
|
+
if (shown.length > 0 && shown.every(change => change.origin === 'code' && isShapeChangePath(change.path, type))) {
|
|
310
|
+
return [note('payload format changed (CLI upgrade)')];
|
|
311
|
+
}
|
|
312
|
+
// Otherwise what changed lives outside the construct (a script in its own
|
|
313
|
+
// file, a request body), or is a value the codegen elides.
|
|
314
|
+
const lines = [];
|
|
315
|
+
for (const change of shown) {
|
|
316
|
+
const hashed = isHash(change.before) || isHash(change.after) || isHash(change.remote?.after);
|
|
317
|
+
if (hashed || isOutsideConstruct(type, change.path)) {
|
|
318
|
+
lines.push(...contentDiff(change, entry.before, local.payload, maxLines));
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
lines.push(note(listChange(change)));
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return lines;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/services/deploy-diff/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leaf paths whose difference is a CLI upgrade changing how a payload is
|
|
3
|
+
* spelled, not a user editing a construct: private locations moving from an
|
|
4
|
+
* inline list to assignment resources, `doubleCheck` becoming a retry
|
|
5
|
+
* strategy, alert settings and parallel scheduling moving to the v2 group
|
|
6
|
+
* defaults. After such an upgrade every affected resource reports a
|
|
7
|
+
* code-origin change once and rewrites its snapshot; rather than render a
|
|
8
|
+
* property diff of two spellings of the same thing, the preview says so.
|
|
9
|
+
*
|
|
10
|
+
* An enumerated list, extended with each shape change. It carries no copy of
|
|
11
|
+
* any backend default: membership is by path alone, which is why the
|
|
12
|
+
* renderer consults it only once the two renderings agree — a user editing
|
|
13
|
+
* one of these properties differs in the construct, and prints as that.
|
|
14
|
+
*
|
|
15
|
+
* A path that is a shape change for one resource type may be an ordinary
|
|
16
|
+
* property of another (`/description` on a dashboard against a check), so
|
|
17
|
+
* the paths a type adds are listed under that type.
|
|
18
|
+
*/
|
|
19
|
+
const SHAPE_CHANGE_PATHS = new Set([
|
|
20
|
+
'/privateLocations',
|
|
21
|
+
'/doubleCheck',
|
|
22
|
+
'/retryStrategy',
|
|
23
|
+
'/alertSettings',
|
|
24
|
+
'/useGlobalAlertSettings',
|
|
25
|
+
'/runParallel',
|
|
26
|
+
]);
|
|
27
|
+
// Keys the construct used to leave out of the payload when unset and now
|
|
28
|
+
// sends with its default or cleared value, so that a deploy resets what the
|
|
29
|
+
// web app set. For a row that holds another value the API reports the first
|
|
30
|
+
// plan after the upgrade as a change made in Checkly (it knows the value the
|
|
31
|
+
// CLI sends for an unset property), which renders as a construct diff and is
|
|
32
|
+
// offered for write-back, so the list is not consulted for it. It is for the
|
|
33
|
+
// first plan of a resource the API compares with the deployed row alone (no
|
|
34
|
+
// snapshot), where such a difference still arrives as a code-origin change
|
|
35
|
+
// from an absent leaf. A private location's proxy URL is sensitive: the API
|
|
36
|
+
// reports its first null plainly only when the row holds no proxy, so a
|
|
37
|
+
// proxy the deploy clears still renders as a secret change.
|
|
38
|
+
const SHAPE_CHANGE_PATHS_BY_TYPE = new Map([
|
|
39
|
+
['alert-channel', new Set(['/sendRecovery', '/sendFailure', '/sendDegraded', '/sslExpiry', '/sslExpiryThreshold'])],
|
|
40
|
+
['private-location', new Set(['/proxyUrl'])],
|
|
41
|
+
['dashboard', new Set(['/customUrl', '/customDomain', '/logo', '/favicon', '/link', '/header', '/description'])],
|
|
42
|
+
]);
|
|
43
|
+
/** Whether a reported change path is one of the known shape changes for the resource type, or lies under one. */
|
|
44
|
+
export function isShapeChangePath(path, type) {
|
|
45
|
+
const known = [...SHAPE_CHANGE_PATHS, ...(SHAPE_CHANGE_PATHS_BY_TYPE.get(type) ?? [])];
|
|
46
|
+
return known.some(prefix => path === prefix || path.startsWith(`${prefix}/`));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=shape-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-changes.js","sourceRoot":"","sources":["../../../src/services/deploy-diff/shape-changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IACtD,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,yBAAyB;IACzB,cAAc;CACf,CAAC,CAAA;AAEF,yEAAyE;AACzE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;AAC5E,wEAAwE;AACxE,4DAA4D;AAC5D,MAAM,0BAA0B,GAA6C,IAAI,GAAG,CAAC;IACnF,CAAC,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACnH,CAAC,kBAAkB,EAAE,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;CACjH,CAAC,CAAA;AAEF,iHAAiH;AACjH,MAAM,UAAU,iBAAiB,CAAE,IAAY,EAAE,IAAY;IAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,kBAAkB,EAAE,GAAG,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACtF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA;AAC/E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TSESTree } from '@typescript-eslint/types';
|
|
2
|
+
import type { Construct } from '../../constructs/construct.js';
|
|
3
|
+
import { type ParsedSource } from '../write-back/source-file.js';
|
|
4
|
+
/**
|
|
5
|
+
* The project's source files as the deploy plan reads them, each parsed
|
|
6
|
+
* once however many constructs it declares. Everything here is best effort:
|
|
7
|
+
* a file that cannot be read or parsed, or a construct whose declaration
|
|
8
|
+
* cannot be found in it, yields `undefined`, and the plan renders without
|
|
9
|
+
* what the source would have told it.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SourceIndex {
|
|
12
|
+
#private;
|
|
13
|
+
source(filePath: string): ParsedSource | undefined;
|
|
14
|
+
/** The options literal of the construct's `new <Class>('<logicalId>', { … })` in the file that declares it. */
|
|
15
|
+
options(construct: Construct): TSESTree.ObjectExpression | undefined;
|
|
16
|
+
/** The properties the construct's declaration spells out (`ContextOptions.spelledOut`), when it can be read. */
|
|
17
|
+
spelledOut(construct: Construct): ReadonlySet<string> | undefined;
|
|
18
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { exportedNamesOf, findConstructOptions, parseSource, spelledOutPaths, WriteBackSkipped, } from '../write-back/source-file.js';
|
|
3
|
+
/**
|
|
4
|
+
* The project's source files as the deploy plan reads them, each parsed
|
|
5
|
+
* once however many constructs it declares. Everything here is best effort:
|
|
6
|
+
* a file that cannot be read or parsed, or a construct whose declaration
|
|
7
|
+
* cannot be found in it, yields `undefined`, and the plan renders without
|
|
8
|
+
* what the source would have told it.
|
|
9
|
+
*/
|
|
10
|
+
export class SourceIndex {
|
|
11
|
+
#sources = new Map();
|
|
12
|
+
source(filePath) {
|
|
13
|
+
if (!this.#sources.has(filePath)) {
|
|
14
|
+
let source;
|
|
15
|
+
try {
|
|
16
|
+
source = parseSource(filePath, fs.readFileSync(filePath, 'utf8'));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// A file that cannot be read or parsed tells nothing.
|
|
20
|
+
}
|
|
21
|
+
this.#sources.set(filePath, source);
|
|
22
|
+
}
|
|
23
|
+
return this.#sources.get(filePath);
|
|
24
|
+
}
|
|
25
|
+
/** The options literal of the construct's `new <Class>('<logicalId>', { … })` in the file that declares it. */
|
|
26
|
+
options(construct) {
|
|
27
|
+
const filePath = construct.checkFileAbsolutePath;
|
|
28
|
+
const source = filePath !== undefined ? this.source(filePath) : undefined;
|
|
29
|
+
if (source === undefined) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return findConstructOptions(source, construct.logicalId, exportedNamesOf(construct));
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (err instanceof WriteBackSkipped) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** The properties the construct's declaration spells out (`ContextOptions.spelledOut`), when it can be read. */
|
|
43
|
+
spelledOut(construct) {
|
|
44
|
+
const options = this.options(construct);
|
|
45
|
+
return options === undefined ? undefined : spelledOutPaths(options);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=source-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-index.js","sourceRoot":"","sources":["../../../src/services/deploy-diff/source-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AAKxB,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,WAAW,EAEX,eAAe,EACf,gBAAgB,GACjB,MAAM,8BAA8B,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IACb,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAA;IAE/D,MAAM,CAAE,QAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,IAAI,MAAgC,CAAA;YACpC,IAAI,CAAC;gBACH,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACpC,CAAC;IAED,+GAA+G;IAC/G,OAAO,CAAE,SAAoB;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,qBAAqB,CAAA;QAChD,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACzE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;QACtF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;gBACpC,OAAO,SAAS,CAAA;YAClB,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,gHAAgH;IAChH,UAAU,CAAE,SAAoB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACvC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IACrE,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Project } from '../../constructs/project.js';
|
|
2
|
+
import { type ConstructExport } from '../../constructs/session.js';
|
|
3
|
+
import { SourceIndex } from './source-index.js';
|
|
4
|
+
/** The variable each construct goes by in the user's code, keyed like `PhysicalIds` (`idKey`). */
|
|
5
|
+
export type VariableNames = ReadonlyMap<string, string>;
|
|
6
|
+
/**
|
|
7
|
+
* The name each referenceable construct of the project (a group, an alert
|
|
8
|
+
* channel, a private location, a status page and its parts) has in the
|
|
9
|
+
* user's code, so a deploy preview refers to it the way the code does rather
|
|
10
|
+
* than by a name generated from its logical id.
|
|
11
|
+
*
|
|
12
|
+
* The name the file that creates the construct exports it by comes first: it
|
|
13
|
+
* is what another file imports the construct by, and it is known however the
|
|
14
|
+
* construct was made. A file that exports the construct by several names
|
|
15
|
+
* settles it with the one its declaration uses. Check files are the only
|
|
16
|
+
* files whose exports are seen, so for the rest (a construct declared in a
|
|
17
|
+
* shared module, or one that is not exported) the name is read from the
|
|
18
|
+
* declaration in the file that creates the construct. An export from some
|
|
19
|
+
* other check file, which passes the construct on under a name of its own,
|
|
20
|
+
* comes last. A construct with none of these is left out and keeps its
|
|
21
|
+
* generated name.
|
|
22
|
+
*
|
|
23
|
+
* The name is the one where the construct is made. A file that imports the
|
|
24
|
+
* construct under an alias, or reaches it through a namespace, still calls
|
|
25
|
+
* it something else. And two constructs that go by the same name in
|
|
26
|
+
* different files cannot both have it in one rendered construct: the second
|
|
27
|
+
* one registered gets a counter (`group`, `group2`), the same on both sides
|
|
28
|
+
* of a comparison.
|
|
29
|
+
*/
|
|
30
|
+
export declare function constructVariableNames(project: Project, exports?: readonly ConstructExport[], sources?: SourceIndex): VariableNames;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Session } from '../../constructs/session.js';
|
|
2
|
+
import { exportedNamesOf, findConstructVariable, IDENTIFIER } from '../write-back/source-file.js';
|
|
3
|
+
import { idKey, REFERENCEABLE_TYPES } from './import-shape.js';
|
|
4
|
+
import { SourceIndex } from './source-index.js';
|
|
5
|
+
/**
|
|
6
|
+
* The name each referenceable construct of the project (a group, an alert
|
|
7
|
+
* channel, a private location, a status page and its parts) has in the
|
|
8
|
+
* user's code, so a deploy preview refers to it the way the code does rather
|
|
9
|
+
* than by a name generated from its logical id.
|
|
10
|
+
*
|
|
11
|
+
* The name the file that creates the construct exports it by comes first: it
|
|
12
|
+
* is what another file imports the construct by, and it is known however the
|
|
13
|
+
* construct was made. A file that exports the construct by several names
|
|
14
|
+
* settles it with the one its declaration uses. Check files are the only
|
|
15
|
+
* files whose exports are seen, so for the rest (a construct declared in a
|
|
16
|
+
* shared module, or one that is not exported) the name is read from the
|
|
17
|
+
* declaration in the file that creates the construct. An export from some
|
|
18
|
+
* other check file, which passes the construct on under a name of its own,
|
|
19
|
+
* comes last. A construct with none of these is left out and keeps its
|
|
20
|
+
* generated name.
|
|
21
|
+
*
|
|
22
|
+
* The name is the one where the construct is made. A file that imports the
|
|
23
|
+
* construct under an alias, or reaches it through a namespace, still calls
|
|
24
|
+
* it something else. And two constructs that go by the same name in
|
|
25
|
+
* different files cannot both have it in one rendered construct: the second
|
|
26
|
+
* one registered gets a counter (`group`, `group2`), the same on both sides
|
|
27
|
+
* of a comparison.
|
|
28
|
+
*/
|
|
29
|
+
export function constructVariableNames(project, exports = Session.constructExports, sources = new SourceIndex()) {
|
|
30
|
+
const names = new Map();
|
|
31
|
+
for (const type of REFERENCEABLE_TYPES) {
|
|
32
|
+
for (const [logicalId, construct] of Object.entries(project.data[type])) {
|
|
33
|
+
// A reference construct (`fromId(...)`) is rendered as the reference it is.
|
|
34
|
+
if (construct.member === false) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const declaredIn = construct.checkFileAbsolutePath;
|
|
38
|
+
const exported = exports
|
|
39
|
+
.filter(candidate => candidate.type === type && candidate.logicalId === logicalId
|
|
40
|
+
&& candidate.exportName !== 'default' && IDENTIFIER.test(candidate.exportName));
|
|
41
|
+
const own = exported.filter(candidate => candidate.filePath === declaredIn).map(({ exportName }) => exportName);
|
|
42
|
+
const declared = () => {
|
|
43
|
+
const source = declaredIn !== undefined ? sources.source(declaredIn) : undefined;
|
|
44
|
+
return source && findConstructVariable(source, logicalId, exportedNamesOf(construct));
|
|
45
|
+
};
|
|
46
|
+
let name;
|
|
47
|
+
if (own.length === 1) {
|
|
48
|
+
name = own[0];
|
|
49
|
+
}
|
|
50
|
+
else if (own.length > 1) {
|
|
51
|
+
const variable = declared();
|
|
52
|
+
name = variable !== undefined && own.includes(variable) ? variable : own[0];
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
name = declared() ?? exported[0]?.exportName;
|
|
56
|
+
}
|
|
57
|
+
if (name !== undefined) {
|
|
58
|
+
names.set(idKey(type, logicalId), name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return names;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=variable-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-names.js","sourceRoot":"","sources":["../../../src/services/deploy-diff/variable-names.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACjG,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAK/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAgB,EAChB,UAAsC,OAAO,CAAC,gBAAgB,EAC9D,UAAuB,IAAI,WAAW,EAAE;IAExC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACxE,4EAA4E;YAC5E,IAAI,SAAS,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC/B,SAAQ;YACV,CAAC;YACD,MAAM,UAAU,GAAG,SAAS,CAAC,qBAAqB,CAAA;YAClD,MAAM,QAAQ,GAAG,OAAO;iBACrB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;mBAC5E,SAAS,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAA;YACnF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAA;YAC/G,MAAM,QAAQ,GAAG,GAAG,EAAE;gBACpB,MAAM,MAAM,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBAChF,OAAO,MAAM,IAAI,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;YACvF,CAAC,CAAA;YACD,IAAI,IAAwB,CAAA;YAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACf,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAA;gBAC3B,IAAI,GAAG,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC7E,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,QAAQ,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,CAAA;YAC9C,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -8,6 +8,9 @@ function resolveWithConfig(version, config) {
|
|
|
8
8
|
if (seen.has(current))
|
|
9
9
|
break;
|
|
10
10
|
seen.add(current);
|
|
11
|
+
if (config.aliases?.includes(current)) {
|
|
12
|
+
return { version: current, notices, denied: false };
|
|
13
|
+
}
|
|
11
14
|
const sv = semver.coerce(current);
|
|
12
15
|
if (!sv) {
|
|
13
16
|
return { version: config.default, notices, denied: false };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-resolver.js","sourceRoot":"","sources":["../../src/services/engine-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAE,eAAe,EAA4B,MAAM,0BAA0B,CAAA;AAQrG,SAAS,iBAAiB,CAAE,OAAe,EAAE,MAA2B;IACtE,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,IAAI,OAAO,GAAG,OAAO,CAAA;IAErB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,MAAK;QAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAEjB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACjC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAC5D,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;gBAAE,SAAQ;YAChD,OAAO,GAAG,IAAI,CAAA;YAEd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;YAC5D,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;YAC/C,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA;YACnC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;YAClD,CAAC;YAED,OAAO,GAAG,IAAI,CAAA;YACd,MAAK;QACP,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAE,OAAe,EAAE,UAAkB;IAC7E,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IACrC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAChD,CAAC;IACD,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC3C,CAAC"}
|
|
1
|
+
{"version":3,"file":"engine-resolver.js","sourceRoot":"","sources":["../../src/services/engine-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAE,eAAe,EAA4B,MAAM,0BAA0B,CAAA;AAQrG,SAAS,iBAAiB,CAAE,OAAe,EAAE,MAA2B;IACtE,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,IAAI,OAAO,GAAG,OAAO,CAAA;IAErB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,MAAK;QAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAEjB,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QACrD,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACjC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAC5D,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;gBAAE,SAAQ;YAChD,OAAO,GAAG,IAAI,CAAA;YAEd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;YAC5D,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;YAC/C,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA;YACnC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;YAClD,CAAC;YAED,OAAO,GAAG,IAAI,CAAA;YACd,MAAK;QACP,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAE,OAAe,EAAE,UAAkB;IAC7E,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IACrC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAChD,CAAC;IACD,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC3C,CAAC"}
|
|
@@ -7,6 +7,12 @@ export interface EngineRule {
|
|
|
7
7
|
}
|
|
8
8
|
export interface EngineVersionConfig {
|
|
9
9
|
default: string;
|
|
10
|
+
/**
|
|
11
|
+
* Version strings accepted exactly as written, before any semver coercion.
|
|
12
|
+
* Bun's `'1'` means "the newest 1.x available on the runner"; coerced, it
|
|
13
|
+
* would read as 1.0.0 and be remapped like an old version.
|
|
14
|
+
*/
|
|
15
|
+
aliases?: string[];
|
|
10
16
|
rules: EngineRule[];
|
|
11
17
|
}
|
|
12
18
|
interface EngineEntry {
|