diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a4b0c67d5163..daaf5effc2a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: "CI: Build & Test" +name: 'CI: Build & Test' on: push: branches: @@ -17,7 +17,7 @@ on: required: false schedule: # Run every day at midnight (without cache) - - cron: "0 0 * * *" + - cron: '0 0 * * *' # Cancel in progress workflows on pull_requests. # https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value @@ -57,7 +57,7 @@ env: # https://bsky.app/profile/joyeecheung.bsky.social/post/3lhy6o54fo22h # Apparently some of our CI failures are attributable to a corrupt v8 cache, causing v8 failures with: "Check failed: current == end_slot_index.". # This option both controls the `v8-compile-cache-lib` and `v8-compile-cache` packages. - DISABLE_V8_COMPILE_CACHE: "1" + DISABLE_V8_COMPILE_CACHE: '1' jobs: job_get_metadata: @@ -85,7 +85,7 @@ jobs: with: ref: ${{ github.event.pull_request.base.sha }} - - name: "Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }})" + - name: 'Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }})' uses: actions/checkout@v6 with: ref: ${{ env.HEAD_COMMIT }} @@ -93,7 +93,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Install Dependencies uses: ./.github/actions/install-dependencies @@ -200,7 +200,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore NX cache uses: actions/cache/restore@v5 with: @@ -239,7 +239,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore NX cache uses: actions/cache/restore@v5 with: @@ -296,7 +296,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -328,7 +328,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -351,7 +351,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Check that yarn.lock is stable run: yarn install --frozen-lockfile --ignore-engines - name: Check for duplicate dependencies in lockfile @@ -371,7 +371,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Install Dependencies uses: ./.github/actions/install-dependencies @@ -393,7 +393,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -403,14 +403,7 @@ jobs: job_artifacts: name: Upload Artifacts - needs: - [ - job_get_metadata, - job_build, - job_build_layer, - job_build_bundles, - job_build_tarballs, - ] + needs: [job_get_metadata, job_build, job_build_layer, job_build_bundles, job_build_tarballs] runs-on: ubuntu-24.04 # Build artifacts are only needed for releasing workflow. if: needs.job_get_metadata.outputs.is_release == 'true' @@ -422,7 +415,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -478,7 +471,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -513,7 +506,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Set up Bun uses: oven-sh/setup-bun@v2 - name: Restore caches @@ -538,7 +531,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Set up Deno uses: denoland/setup-deno@v2.0.4 with: @@ -632,9 +625,9 @@ jobs: # Only check all projects for full bundle # We also shard the tests as they take the longest - bundle: bundle_tracing_replay_feedback_logs_metrics_min - project: "webkit" + project: 'webkit' - bundle: bundle_tracing_replay_feedback_logs_metrics_min - project: "firefox" + project: 'firefox' - bundle: esm project: chromium shard: 1 @@ -654,7 +647,7 @@ jobs: exclude: # Do not run the un-sharded esm tests - bundle: esm - project: "chromium" + project: 'chromium' steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) @@ -664,7 +657,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -738,7 +731,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -794,7 +787,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -823,7 +816,7 @@ jobs: include: # Only check typescript for latest version (to streamline CI) - node: 24 - typescript: "3.8" + typescript: '3.8' steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v6 @@ -864,7 +857,7 @@ jobs: include: # Only check typescript for latest version (to streamline CI) - node: 24 - typescript: "3.8" + typescript: '3.8' steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v6 @@ -901,7 +894,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: @@ -925,7 +918,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Set up Bun uses: oven-sh/setup-bun@v2 - name: Restore caches @@ -991,7 +984,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "package.json" + node-version-file: 'package.json' - name: Restore NX cache uses: actions/cache/restore@v5 with: @@ -1022,19 +1015,20 @@ jobs: name: E2E ${{ matrix.label || matrix.test-application }} Test # We need to add the `always()` check here because the previous step has this as well :( # See: https://github.com/actions/runner/issues/2205 - if: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix !='{"include":[]}' + if: + always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix !='{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] runs-on: ubuntu-24.04 timeout-minutes: 15 env: # We just use a dummy DSN here, only send to the tunnel anyhow - E2E_TEST_DSN: "https://username@domain/123" + E2E_TEST_DSN: 'https://username@domain/123' # Needed because some apps expect a certain prefix - NEXT_PUBLIC_E2E_TEST_DSN: "https://username@domain/123" - PUBLIC_E2E_TEST_DSN: "https://username@domain/123" - REACT_APP_E2E_TEST_DSN: "https://username@domain/123" - E2E_TEST_SENTRY_ORG_SLUG: "sentry-javascript-sdks" - E2E_TEST_SENTRY_PROJECT: "sentry-javascript-e2e-tests" + NEXT_PUBLIC_E2E_TEST_DSN: 'https://username@domain/123' + PUBLIC_E2E_TEST_DSN: 'https://username@domain/123' + REACT_APP_E2E_TEST_DSN: 'https://username@domain/123' + E2E_TEST_SENTRY_ORG_SLUG: 'sentry-javascript-sdks' + E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false matrix: ${{ fromJson(needs.job_build.outputs.e2e-matrix) }} @@ -1049,7 +1043,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/package.json" + node-version-file: 'dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/package.json' - name: Set up Bun if: contains(fromJSON('["node-exports-test-app","nextjs-16-bun", "elysia-bun", "hono-4"]'), @@ -1166,8 +1160,8 @@ jobs: NEXT_PUBLIC_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} PUBLIC_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} REACT_APP_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} - E2E_TEST_SENTRY_ORG_SLUG: "sentry-javascript-sdks" - E2E_TEST_SENTRY_PROJECT: "sentry-javascript-e2e-tests" + E2E_TEST_SENTRY_ORG_SLUG: 'sentry-javascript-sdks' + E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false matrix: ${{ fromJson(needs.job_build.outputs.e2e-matrix-optional) }} @@ -1183,7 +1177,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v6 with: - node-version-file: "dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/package.json" + node-version-file: 'dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/package.json' - name: Restore caches uses: ./.github/actions/restore-cache with: diff --git a/dev-packages/e2e-tests/test-applications/ember-classic/app/instance-initializers/sentry-performance.ts b/dev-packages/e2e-tests/test-applications/ember-classic/app/instance-initializers/sentry-performance.ts index 1d56dcc2dd83..b7c3f70b1e30 100644 --- a/dev-packages/e2e-tests/test-applications/ember-classic/app/instance-initializers/sentry-performance.ts +++ b/dev-packages/e2e-tests/test-applications/ember-classic/app/instance-initializers/sentry-performance.ts @@ -1,12 +1,11 @@ import type ApplicationInstance from '@ember/application/instance'; -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { instrumentAppInstancePerformance } from '@sentry/ember'; export function initialize(appInstance: ApplicationInstance): void { - addIntegration(browserTracingIntegration({ - appInstance, + instrumentAppInstancePerformance(appInstance, { minimumRunloopQueueDuration: 0, minimumComponentRenderDuration: 0, - })); + }); } export default { diff --git a/dev-packages/e2e-tests/test-applications/ember-classic/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/ember-classic/tests/errors.test.ts index 3f4b1f5c099e..a34194d4fd30 100644 --- a/dev-packages/e2e-tests/test-applications/ember-classic/tests/errors.test.ts +++ b/dev-packages/e2e-tests/test-applications/ember-classic/tests/errors.test.ts @@ -31,7 +31,7 @@ test('sends an error', async ({ page }) => { test('assigns the correct transaction value after a navigation', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const errorPromise = waitForError('ember-classic', async errorEvent => { diff --git a/dev-packages/e2e-tests/test-applications/ember-classic/tests/performance.test.ts b/dev-packages/e2e-tests/test-applications/ember-classic/tests/performance.test.ts index e6aa4747bf92..696a82a9c7e2 100644 --- a/dev-packages/e2e-tests/test-applications/ember-classic/tests/performance.test.ts +++ b/dev-packages/e2e-tests/test-applications/ember-classic/tests/performance.test.ts @@ -3,7 +3,7 @@ import { waitForTransaction } from '@sentry-internal/test-utils'; test('sends a pageload transaction with a parameterized URL', async ({ page }) => { const transactionPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); await page.goto(`/`); @@ -26,11 +26,11 @@ test('sends a pageload transaction with a parameterized URL', async ({ page }) = test('sends a navigation transaction with a parameterized URL', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const navigationTxnPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; }); await page.goto(`/`); @@ -54,11 +54,11 @@ test('sends a navigation transaction with a parameterized URL', async ({ page }) test('sends a navigation transaction even if the pageload span is still active', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const navigationTxnPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; }); await page.goto(`/`); @@ -99,11 +99,11 @@ test('sends a navigation transaction even if the pageload span is still active', test('captures correct spans for navigation', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const navigationTxnPromise = waitForTransaction('ember-classic', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; }); await page.goto(`/tracing`); diff --git a/dev-packages/e2e-tests/test-applications/ember-embroider/app/instance-initializers/sentry-performance.ts b/dev-packages/e2e-tests/test-applications/ember-embroider/app/instance-initializers/sentry-performance.ts index 1d56dcc2dd83..b7c3f70b1e30 100644 --- a/dev-packages/e2e-tests/test-applications/ember-embroider/app/instance-initializers/sentry-performance.ts +++ b/dev-packages/e2e-tests/test-applications/ember-embroider/app/instance-initializers/sentry-performance.ts @@ -1,12 +1,11 @@ import type ApplicationInstance from '@ember/application/instance'; -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { instrumentAppInstancePerformance } from '@sentry/ember'; export function initialize(appInstance: ApplicationInstance): void { - addIntegration(browserTracingIntegration({ - appInstance, + instrumentAppInstancePerformance(appInstance, { minimumRunloopQueueDuration: 0, minimumComponentRenderDuration: 0, - })); + }); } export default { diff --git a/dev-packages/e2e-tests/test-applications/ember-embroider/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/ember-embroider/tests/errors.test.ts index e9cfd7e9f1c6..50ec82e11153 100644 --- a/dev-packages/e2e-tests/test-applications/ember-embroider/tests/errors.test.ts +++ b/dev-packages/e2e-tests/test-applications/ember-embroider/tests/errors.test.ts @@ -31,7 +31,7 @@ test('sends an error', async ({ page }) => { test('assigns the correct transaction value after a navigation', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const errorPromise = waitForError('ember-embroider', async errorEvent => { diff --git a/dev-packages/e2e-tests/test-applications/ember-embroider/tests/performance.test.ts b/dev-packages/e2e-tests/test-applications/ember-embroider/tests/performance.test.ts index a82964b46a92..b64838abe288 100644 --- a/dev-packages/e2e-tests/test-applications/ember-embroider/tests/performance.test.ts +++ b/dev-packages/e2e-tests/test-applications/ember-embroider/tests/performance.test.ts @@ -3,7 +3,7 @@ import { waitForTransaction } from '@sentry-internal/test-utils'; test('sends a pageload transaction with a parameterized URL', async ({ page }) => { const transactionPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); await page.goto(`/`); @@ -26,11 +26,11 @@ test('sends a pageload transaction with a parameterized URL', async ({ page }) = test('sends a navigation transaction with a parameterized URL', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const navigationTxnPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; }); await page.goto(`/`); @@ -54,11 +54,11 @@ test('sends a navigation transaction with a parameterized URL', async ({ page }) test('sends a navigation transaction even if the pageload span is still active', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const navigationTxnPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; }); await page.goto(`/`); @@ -99,11 +99,11 @@ test('sends a navigation transaction even if the pageload span is still active', test('captures correct spans for navigation', async ({ page }) => { const pageloadTxnPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; }); const navigationTxnPromise = waitForTransaction('ember-embroider', async transactionEvent => { - return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; }); await page.goto(`/tracing`); diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/.gitignore b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/.gitignore new file mode 100644 index 000000000000..df2af05cbfdd --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/.gitignore @@ -0,0 +1,2 @@ +/test-results +/dist diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/babel.config.cjs b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/babel.config.cjs new file mode 100644 index 000000000000..93f46269427a --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/babel.config.cjs @@ -0,0 +1,37 @@ +/** + * This babel config is used for local tests in the e2e app. + */ +const { buildMacros } = require('@embroider/macros/babel'); + +const macros = buildMacros(); + +module.exports = { + plugins: [ + [ + '@babel/plugin-transform-typescript', + { + allExtensions: true, + allowDeclareFields: true, + onlyRemoveTypeImports: true, + }, + ], + [ + 'babel-plugin-ember-template-compilation', + { + transforms: [...macros.templateMacros], + }, + ], + [ + 'module:decorator-transforms', + { + runtime: { + import: require.resolve('decorator-transforms/runtime-esm'), + }, + }, + ], + ...macros.babelMacros, + ], + generatorOpts: { + compact: false, + }, +}; diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/index.html b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/index.html new file mode 100644 index 000000000000..ee0fb589b572 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/index.html @@ -0,0 +1,19 @@ + + + + + + Demo App + + + + + + + + + diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/package.json b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/package.json new file mode 100644 index 000000000000..3502d5ab801c --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/package.json @@ -0,0 +1,46 @@ +{ + "name": "ember-strict-resolver", + "version": "0.0.0", + "private": true, + "description": "Standalone Ember SDK demo app for e2e tests", + "license": "MIT", + "scripts": { + "build": "vite build", + "start": "vite preview --port 3030", + "test": "playwright test", + "test:build": "pnpm install && pnpm run build", + "test:assert": "pnpm run test" + }, + "devDependencies": { + "@playwright/test": "~1.56.0", + "@babel/core": "^7.29.0", + "@babel/plugin-transform-typescript": "^7.28.6", + "@babel/runtime": "^7.29.2", + "@ember/app-tsconfig": "^2.0.0", + "@embroider/compat": "^4.1.17", + "@embroider/core": "^4.4.7", + "@embroider/macros": "^1.20.2", + "@embroider/vite": "^1.7.2", + "@glint/ember-tsc": "^1.5.0", + "@glint/template": "^1.7.7", + "@rollup/plugin-babel": "^7.0.0", + "@sentry/ember": "file:../../packed/sentry-ember-packed.tgz", + "@sentry-internal/test-utils": "link:../../../test-utils", + "babel-plugin-ember-template-compilation": "^4.0.0", + "decorator-transforms": "^2.3.1", + "ember-page-title": "^9.0.3", + "ember-source": "^6.12.0", + "ember-strict-application-resolver": "^0.1.1", + "typescript": "~5.9.3", + "vite": "^7.3.2" + }, + "engines": { + "node": ">=18" + }, + "ember": { + "edition": "octane" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/playwright.config.mjs new file mode 100644 index 000000000000..fa015b64f79b --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/playwright.config.mjs @@ -0,0 +1,10 @@ +import { getPlaywrightConfig } from '@sentry-internal/test-utils'; + +const config = getPlaywrightConfig({ + startCommand: 'pnpm start', + eventProxyFile: 'start-event-proxy.mjs', + eventProxyPort: 3031, + port: 3030, +}); + +export default config; diff --git a/packages/ember/demo-app/app.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/app.gts similarity index 64% rename from packages/ember/demo-app/app.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/app.gts index 13c5bcab09a1..f3b26b618d18 100644 --- a/packages/ember/demo-app/app.gts +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/app.gts @@ -7,22 +7,7 @@ import * as Sentry from '@sentry/ember'; Sentry.init({ dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0', tracesSampleRate: 1.0, - // Use a mock transport for dev mode - transport: () => ({ - send: (envelope: unknown) => { - const win = window as Window & { _sentryTestEvents?: unknown[] }; - const items = - (envelope as [unknown, Array<[{ type: string }, unknown]>])[1] || []; - for (const [header, payload] of items) { - if (header.type === 'event' || header.type === 'transaction') { - win._sentryTestEvents = win._sentryTestEvents || []; - win._sentryTestEvents.push(payload); - } - } - return Promise.resolve({}); - }, - flush: () => Promise.resolve(true), - }), + tunnel: 'http://localhost:3031/', // proxy server }); class Router extends EmberRouter { @@ -40,6 +25,12 @@ export class App extends EmberApp { }; } +// Manually register instance initializers +const instanceInitializers = import.meta.glob('./instance-initializers/**/*', { eager: true }); +Object.values(instanceInitializers).forEach(module => { + App.instanceInitializer(module.default); +}); + Router.map(function () { this.route('tracing'); this.route('replay'); diff --git a/packages/ember/demo-app/components/slow-loading-list.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/components/slow-loading-list.gts similarity index 100% rename from packages/ember/demo-app/components/slow-loading-list.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/components/slow-loading-list.gts diff --git a/packages/ember/demo-app/components/test-section.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/components/test-section.gts similarity index 100% rename from packages/ember/demo-app/components/test-section.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/components/test-section.gts diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/instance-initializers/sentry-performance.ts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/instance-initializers/sentry-performance.ts new file mode 100644 index 000000000000..02b0fa780ae1 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/instance-initializers/sentry-performance.ts @@ -0,0 +1,11 @@ +import type ApplicationInstance from '@ember/application/instance'; +import * as Sentry from '@sentry/ember'; + +export function initialize(appInstance: ApplicationInstance): void { + Sentry.instrumentAppInstancePerformance(appInstance); +} + +export default { + initialize, + name: 'sentry-performance', +}; diff --git a/packages/ember/demo-app/routes/slow-loading-route.ts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/slow-loading-route.ts similarity index 89% rename from packages/ember/demo-app/routes/slow-loading-route.ts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/slow-loading-route.ts index 635a2cdedcef..e05a8ab70bf0 100644 --- a/packages/ember/demo-app/routes/slow-loading-route.ts +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/slow-loading-route.ts @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { instrumentRoutePerformance } from '@sentry/ember'; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise(resolve => setTimeout(resolve, ms)); } class SlowLoadingRoute extends Route { diff --git a/packages/ember/demo-app/routes/slow-loading-route/index.ts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/slow-loading-route/index.ts similarity index 89% rename from packages/ember/demo-app/routes/slow-loading-route/index.ts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/slow-loading-route/index.ts index 3be2c9631539..89868d846e23 100644 --- a/packages/ember/demo-app/routes/slow-loading-route/index.ts +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/slow-loading-route/index.ts @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { instrumentRoutePerformance } from '@sentry/ember'; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise(resolve => setTimeout(resolve, ms)); } class SlowLoadingRouteIndexRoute extends Route { diff --git a/packages/ember/demo-app/routes/with-error/index.ts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/with-error/index.ts similarity index 100% rename from packages/ember/demo-app/routes/with-error/index.ts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/with-error/index.ts diff --git a/packages/ember/demo-app/routes/with-loading/index.ts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/with-loading/index.ts similarity index 89% rename from packages/ember/demo-app/routes/with-loading/index.ts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/with-loading/index.ts index 3bfb70cebcfc..7f892ec8d9e2 100644 --- a/packages/ember/demo-app/routes/with-loading/index.ts +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/routes/with-loading/index.ts @@ -2,7 +2,7 @@ import Route from '@ember/routing/route'; import { instrumentRoutePerformance } from '@sentry/ember'; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise(resolve => setTimeout(resolve, ms)); } class WithLoadingIndexRoute extends Route { diff --git a/packages/ember/demo-app/styles.css b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/styles.css similarity index 100% rename from packages/ember/demo-app/styles.css rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/styles.css diff --git a/packages/ember/demo-app/templates/application.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/application.gts similarity index 100% rename from packages/ember/demo-app/templates/application.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/application.gts diff --git a/packages/ember/demo-app/templates/index.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/index.gts similarity index 95% rename from packages/ember/demo-app/templates/index.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/index.gts index 931b83cdfff2..0c0cd9b5aa07 100644 --- a/packages/ember/demo-app/templates/index.gts +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/index.gts @@ -1,8 +1,10 @@ import { on } from '@ember/modifier'; import { scheduleOnce } from '@ember/runloop'; +import * as Sentry from '@sentry/ember'; function createError(): void { - throw new Error('Generic Javascript Error'); + // @ts-expect-error this is fine + this.nonExistentFunction(); } function createEmberError(): void { diff --git a/packages/ember/demo-app/templates/slow-loading-route.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/slow-loading-route.gts similarity index 100% rename from packages/ember/demo-app/templates/slow-loading-route.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/slow-loading-route.gts diff --git a/packages/ember/demo-app/templates/slow-loading-route/index.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/slow-loading-route/index.gts similarity index 100% rename from packages/ember/demo-app/templates/slow-loading-route/index.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/slow-loading-route/index.gts diff --git a/packages/ember/demo-app/templates/tracing.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/tracing.gts similarity index 100% rename from packages/ember/demo-app/templates/tracing.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/tracing.gts diff --git a/packages/ember/demo-app/templates/with-error.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-error.gts similarity index 100% rename from packages/ember/demo-app/templates/with-error.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-error.gts diff --git a/packages/ember/demo-app/templates/with-error/error.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-error/error.gts similarity index 100% rename from packages/ember/demo-app/templates/with-error/error.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-error/error.gts diff --git a/packages/ember/demo-app/templates/with-error/index.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-error/index.gts similarity index 100% rename from packages/ember/demo-app/templates/with-error/index.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-error/index.gts diff --git a/packages/ember/demo-app/templates/with-loading.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-loading.gts similarity index 100% rename from packages/ember/demo-app/templates/with-loading.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-loading.gts diff --git a/packages/ember/demo-app/templates/with-loading/index.gts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-loading/index.gts similarity index 100% rename from packages/ember/demo-app/templates/with-loading/index.gts rename to dev-packages/e2e-tests/test-applications/ember-strict-resolver/src/templates/with-loading/index.gts diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/start-event-proxy.mjs new file mode 100644 index 000000000000..0f588cdd1630 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/start-event-proxy.mjs @@ -0,0 +1,6 @@ +import { startEventProxyServer } from '@sentry-internal/test-utils'; + +startEventProxyServer({ + port: 3031, + proxyServerName: 'ember-strict-resolver', +}); diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tests/errors.test.ts new file mode 100644 index 000000000000..d003aec0c290 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tests/errors.test.ts @@ -0,0 +1,79 @@ +import { expect, test } from '@playwright/test'; +import { waitForError, waitForTransaction } from '@sentry-internal/test-utils'; + +test('sends an error', async ({ page }) => { + const errorPromise = waitForError('ember-strict-resolver', async errorEvent => { + return !errorEvent.type; + }); + + await page.goto(`/`); + + await page.locator('[data-test-button="Throw Generic Javascript Error"]').click(); + + const error = await errorPromise; + + expect(error).toMatchObject({ + exception: { + values: [ + { + type: 'TypeError', + value: 'this.nonExistentFunction is not a function', + mechanism: { + type: 'auto.browser.browserapierrors.addEventListener', + handled: false, + }, + }, + ], + }, + transaction: 'route:index', + }); +}); + +test('assigns the correct transaction value after a navigation', async ({ page }) => { + const pageloadTxnPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + }); + + const errorPromise = waitForError('ember-strict-resolver', async errorEvent => { + return !errorEvent.type; + }); + + await page.goto(`/tracing`); + await pageloadTxnPromise; + + await page.getByText('Home').click(); + + const [_, error] = await Promise.all([ + page.locator('[data-test-button="Throw Generic Javascript Error"]').click(), + errorPromise, + ]); + + expect(error).toMatchObject({ + exception: { + values: [ + { + type: 'TypeError', + value: 'this.nonExistentFunction is not a function', + mechanism: { + type: 'auto.browser.browserapierrors.addEventListener', + handled: false, + }, + }, + ], + }, + transaction: 'route:index', + }); +}); + +test('captures Ember error', async ({ page }) => { + const errorPromise = waitForError('ember-strict-resolver', event => { + return event.exception?.values?.[0]?.value?.includes('EmberError') ?? false; + }); + + await page.goto('/'); + await page.locator('[data-test-button="Throw EmberError"]').click(); + + const errorEvent = await errorPromise; + + expect(errorEvent.exception?.values?.[0]?.value).toContain('EmberError'); +}); diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tests/sentry-performance.test.ts b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tests/sentry-performance.test.ts new file mode 100644 index 000000000000..798a320f5a10 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tests/sentry-performance.test.ts @@ -0,0 +1,396 @@ +import { expect, test } from '@playwright/test'; +import { waitForTransaction } from '@sentry-internal/test-utils'; + +test('sends a pageload transaction with a parameterized URL', async ({ page }) => { + const transactionPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + }); + + await page.goto(`/`); + + const rootSpan = await transactionPromise; + + expect(rootSpan).toMatchObject({ + contexts: { + trace: { + op: 'pageload', + origin: 'auto.pageload.ember', + }, + }, + transaction: 'route:index', + transaction_info: { + source: 'route', + }, + }); +}); + +test('sends a navigation transaction with a parameterized URL', async ({ page }) => { + const pageloadTxnPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + }); + + const navigationTxnPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + }); + + await page.goto(`/`); + await pageloadTxnPromise; + + const [_, navigationTxn] = await Promise.all([page.getByText('Tracing').click(), navigationTxnPromise]); + + expect(navigationTxn).toMatchObject({ + contexts: { + trace: { + op: 'navigation', + origin: 'auto.navigation.ember', + }, + }, + transaction: 'route:tracing', + transaction_info: { + source: 'route', + }, + }); +}); + +test('sends a navigation transaction even if the pageload span is still active', async ({ page }) => { + const pageloadTxnPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + }); + + const navigationTxnPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + }); + + await page.goto(`/`); + + // immediately navigate to a different route + const [_, pageloadTxn, navigationTxn] = await Promise.all([ + page.getByText('Tracing').click(), + pageloadTxnPromise, + navigationTxnPromise, + ]); + + expect(pageloadTxn).toMatchObject({ + contexts: { + trace: { + op: 'pageload', + origin: 'auto.pageload.ember', + }, + }, + transaction: 'route:index', + transaction_info: { + source: 'route', + }, + }); + + expect(navigationTxn).toMatchObject({ + contexts: { + trace: { + op: 'navigation', + origin: 'auto.navigation.ember', + }, + }, + transaction: 'route:tracing', + transaction_info: { + source: 'route', + }, + }); +}); + +test('captures correct spans for navigation', async ({ page }) => { + const pageloadTxnPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'pageload'; + }); + + const navigationTxnPromise = waitForTransaction('ember-strict-resolver', async transactionEvent => { + return !!transactionEvent.transaction && transactionEvent.contexts?.trace?.op === 'navigation'; + }); + + await page.goto(`/tracing`); + await pageloadTxnPromise; + + const [_, navigationTxn] = await Promise.all([ + page.getByText('Transition to slow loading route').click(), + navigationTxnPromise, + ]); + + const traceId = navigationTxn.contexts?.trace?.trace_id; + const spanId = navigationTxn.contexts?.trace?.span_id; + + expect(traceId).toBeDefined(); + expect(spanId).toBeDefined(); + + const spans = navigationTxn.spans || []; + + expect(navigationTxn).toMatchObject({ + contexts: { + trace: { + op: 'navigation', + origin: 'auto.navigation.ember', + }, + }, + transaction: 'route:slow-loading-route.index', + transaction_info: { + source: 'route', + }, + }); + + const transitionSpans = spans.filter(span => span.op === 'ui.ember.transition'); + const beforeModelSpans = spans.filter(span => span.op === 'ui.ember.route.before_model'); + const modelSpans = spans.filter(span => span.op === 'ui.ember.route.model'); + const afterModelSpans = spans.filter(span => span.op === 'ui.ember.route.after_model'); + const renderSpans = spans.filter(span => span.op === 'ui.ember.runloop.render'); + + expect(transitionSpans).toHaveLength(1); + + // We have two spans each there - one for `slow-loading-route` and one for `slow-load-route.index` + expect(beforeModelSpans).toHaveLength(2); + expect(modelSpans).toHaveLength(2); + expect(afterModelSpans).toHaveLength(2); + + // There may be many render spans... + expect(renderSpans.length).toBeGreaterThan(1); + + expect(transitionSpans[0]).toEqual({ + data: { + 'sentry.op': 'ui.ember.transition', + 'sentry.origin': 'auto.ui.ember', + }, + description: 'route:tracing -> route:slow-loading-route.index', + op: 'ui.ember.transition', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }); + + expect(beforeModelSpans).toEqual([ + { + data: { + 'sentry.op': 'ui.ember.route.before_model', + 'sentry.origin': 'auto.ui.ember', + 'sentry.source': 'custom', + }, + description: 'slow-loading-route', + op: 'ui.ember.route.before_model', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }, + { + data: { + 'sentry.op': 'ui.ember.route.before_model', + 'sentry.origin': 'auto.ui.ember', + 'sentry.source': 'custom', + }, + description: 'slow-loading-route.index', + op: 'ui.ember.route.before_model', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }, + ]); + + expect(modelSpans).toEqual([ + { + data: { + 'sentry.op': 'ui.ember.route.model', + 'sentry.origin': 'auto.ui.ember', + 'sentry.source': 'custom', + }, + description: 'slow-loading-route', + op: 'ui.ember.route.model', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }, + { + data: { + 'sentry.op': 'ui.ember.route.model', + 'sentry.origin': 'auto.ui.ember', + 'sentry.source': 'custom', + }, + description: 'slow-loading-route.index', + op: 'ui.ember.route.model', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }, + ]); + + expect(afterModelSpans).toEqual([ + { + data: { + 'sentry.op': 'ui.ember.route.after_model', + 'sentry.origin': 'auto.ui.ember', + 'sentry.source': 'custom', + }, + description: 'slow-loading-route', + op: 'ui.ember.route.after_model', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }, + { + data: { + 'sentry.op': 'ui.ember.route.after_model', + 'sentry.origin': 'auto.ui.ember', + 'sentry.source': 'custom', + }, + description: 'slow-loading-route.index', + op: 'ui.ember.route.after_model', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }, + ]); + + expect(renderSpans).toContainEqual({ + data: { + 'sentry.op': 'ui.ember.runloop.render', + 'sentry.origin': 'auto.ui.ember', + }, + description: 'runloop', + op: 'ui.ember.runloop.render', + origin: 'auto.ui.ember', + parent_span_id: spanId, + span_id: expect.stringMatching(/[a-f0-9]{16}/), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: traceId, + }); +}); + +test('handles slow loading route', async ({ page }) => { + const transactionPromise = waitForTransaction('ember-strict-resolver', transactionEvent => { + return transactionEvent.transaction === 'route:slow-loading-route.index'; + }); + await page.goto('/tracing'); + await page.locator('[data-test-button="Transition to slow loading route"]').click(); + + const transaction = await transactionPromise; + expect(transaction).toMatchObject({ + transaction: 'route:slow-loading-route.index', + contexts: { + trace: { + data: { + fromRoute: 'tracing', + toRoute: 'slow-loading-route.index', + }, + }, + }, + }); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.transition', + description: 'route:tracing -> route:slow-loading-route.index', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.before_model', + description: 'slow-loading-route', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.before_model', + description: 'slow-loading-route.index', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.model', + description: 'slow-loading-route.index', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.model', + description: 'slow-loading-route', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.after_model', + description: 'slow-loading-route', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.after_model', + description: 'slow-loading-route.index', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.setup_controller', + description: 'slow-loading-route', + }), + ); + expect(transaction.spans).toContainEqual( + expect.objectContaining({ + op: 'ui.ember.route.setup_controller', + description: 'slow-loading-route.index', + }), + ); +}); + +test('handles page with loading state', async ({ page }) => { + const transactionPromise = waitForTransaction('ember-strict-resolver', transactionEvent => { + return transactionEvent.transaction === 'route:with-loading.index'; + }); + await page.goto('/with-loading'); + + const transaction = await transactionPromise; + expect(transaction).toMatchObject({ + transaction: 'route:with-loading.index', + contexts: { + trace: { + data: { + toRoute: 'with-loading.index', + }, + }, + }, + }); +}); + +test('handles page with error state', async ({ page }) => { + // The route's model hook intentionally throws, so we need to handle errors + const transactionPromise = waitForTransaction('ember-strict-resolver', transactionEvent => { + return transactionEvent.transaction === 'route:with-error.index'; + }); + await page.goto('/with-error'); + + const transaction = await transactionPromise; + expect(transaction).toMatchObject({ + transaction: 'route:with-error.index', + contexts: { + trace: { + data: { + toRoute: 'with-error.index', + }, + }, + }, + }); +}); diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tsconfig.json b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tsconfig.json new file mode 100644 index 000000000000..9e63e049aabf --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@ember/app-tsconfig", + "include": ["tests/**/*", "src/**/*"], + "compilerOptions": { + "rootDir": ".", + "lib": ["DOM", "ES2020"], + "types": ["ember-source/types", "vite/client", "@embroider/core/virtual", "@glint/ember-tsc/types"] + } +} diff --git a/dev-packages/e2e-tests/test-applications/ember-strict-resolver/vite.config.mjs b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/vite.config.mjs new file mode 100644 index 000000000000..ea181c282ed8 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/ember-strict-resolver/vite.config.mjs @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite'; +import { extensions, ember } from '@embroider/vite'; +import { babel } from '@rollup/plugin-babel'; + +export default defineConfig({ + plugins: [ + ember(), + babel({ + babelHelpers: 'inline', + extensions, + }), + ], +}); diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/.ember-cli b/dev-packages/e2e-tests/test-applications/ember-vite/.ember-cli index 05702eb74223..85a62bfab89d 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/.ember-cli +++ b/dev-packages/e2e-tests/test-applications/ember-vite/.ember-cli @@ -1,9 +1,3 @@ { - /** - Ember CLI sends analytics information by default. The data is completely - anonymous, but there are times when you might want to disable this behavior. - - Setting `disableAnalytics` to true will prevent any data from being sent. - */ - "disableAnalytics": true, + "disableAnalytics": true } diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/.template-lintrc.mjs b/dev-packages/e2e-tests/test-applications/ember-vite/.template-lintrc.mjs index 8c6dc5676219..8b6625cd9a94 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/.template-lintrc.mjs +++ b/dev-packages/e2e-tests/test-applications/ember-vite/.template-lintrc.mjs @@ -1,4 +1,4 @@ export default { - extends: "recommended", + extends: 'recommended', checkHbsTemplateLiterals: false, }; diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/app/config/environment.ts b/dev-packages/e2e-tests/test-applications/ember-vite/app/config/environment.ts index e7a2322de452..a6c4b45cd292 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/app/config/environment.ts +++ b/dev-packages/e2e-tests/test-applications/ember-vite/app/config/environment.ts @@ -4,8 +4,14 @@ import { assert } from '@ember/debug'; const config = loadConfigFromMeta('ember-vite') as unknown; assert('config is not an object', typeof config === 'object' && config !== null); -assert('modulePrefix was not detected on your config', 'modulePrefix' in config && typeof config.modulePrefix === 'string'); -assert('locationType was not detected on your config', 'locationType' in config && typeof config.locationType === 'string'); +assert( + 'modulePrefix was not detected on your config', + 'modulePrefix' in config && typeof config.modulePrefix === 'string', +); +assert( + 'locationType was not detected on your config', + 'locationType' in config && typeof config.locationType === 'string', +); assert('rootURL was not detected on your config', 'rootURL' in config && typeof config.rootURL === 'string'); assert('APP was not detected on your config', 'APP' in config && typeof config.APP === 'object'); diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/app/instance-initializers/sentry-performance.ts b/dev-packages/e2e-tests/test-applications/ember-vite/app/instance-initializers/sentry-performance.ts index 1d56dcc2dd83..b7c3f70b1e30 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/app/instance-initializers/sentry-performance.ts +++ b/dev-packages/e2e-tests/test-applications/ember-vite/app/instance-initializers/sentry-performance.ts @@ -1,12 +1,11 @@ import type ApplicationInstance from '@ember/application/instance'; -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { instrumentAppInstancePerformance } from '@sentry/ember'; export function initialize(appInstance: ApplicationInstance): void { - addIntegration(browserTracingIntegration({ - appInstance, + instrumentAppInstancePerformance(appInstance, { minimumRunloopQueueDuration: 0, minimumComponentRenderDuration: 0, - })); + }); } export default { diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/babel.config.mjs b/dev-packages/e2e-tests/test-applications/ember-vite/babel.config.mjs index 5a9924d96a74..5f7a480440db 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/babel.config.mjs +++ b/dev-packages/e2e-tests/test-applications/ember-vite/babel.config.mjs @@ -1,14 +1,11 @@ -import { dirname } from "node:path"; -import { fileURLToPath } from "node:url"; -import { - babelCompatSupport, - templateCompatSupport, -} from "@embroider/compat/babel"; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { babelCompatSupport, templateCompatSupport } from '@embroider/compat/babel'; export default { plugins: [ [ - "@babel/plugin-transform-typescript", + '@babel/plugin-transform-typescript', { allExtensions: true, onlyRemoveTypeImports: true, @@ -16,28 +13,26 @@ export default { }, ], [ - "babel-plugin-ember-template-compilation", + 'babel-plugin-ember-template-compilation', { enableLegacyModules: [ - "ember-cli-htmlbars", - "ember-cli-htmlbars-inline-precompile", - "htmlbars-inline-precompile", + 'ember-cli-htmlbars', + 'ember-cli-htmlbars-inline-precompile', + 'htmlbars-inline-precompile', ], transforms: [...templateCompatSupport()], }, ], [ - "module:decorator-transforms", + 'module:decorator-transforms', { runtime: { - import: fileURLToPath( - import.meta.resolve("decorator-transforms/runtime-esm"), - ), + import: fileURLToPath(import.meta.resolve('decorator-transforms/runtime-esm')), }, }, ], [ - "@babel/plugin-transform-runtime", + '@babel/plugin-transform-runtime', { absoluteRuntime: dirname(fileURLToPath(import.meta.url)), useESModules: true, diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/config/environment.js b/dev-packages/e2e-tests/test-applications/ember-vite/config/environment.js index fc3e02969719..769b0dfcb259 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/config/environment.js +++ b/dev-packages/e2e-tests/test-applications/ember-vite/config/environment.js @@ -1,11 +1,11 @@ -"use strict"; +'use strict'; module.exports = function (environment) { const ENV = { - modulePrefix: "ember-vite", + modulePrefix: 'ember-vite', environment, - rootURL: "/", - locationType: "history", + rootURL: '/', + locationType: 'history', EmberENV: { EXTEND_PROTOTYPES: false, FEATURES: {}, @@ -15,18 +15,18 @@ module.exports = function (environment) { ENV.sentryDsn = process.env.E2E_TEST_DSN; - if (environment === "development") { + if (environment === 'development') { } - if (environment === "test") { - ENV.locationType = "none"; + if (environment === 'test') { + ENV.locationType = 'none'; ENV.APP.LOG_ACTIVE_GENERATION = false; ENV.APP.LOG_VIEW_LOOKUPS = false; - ENV.APP.rootElement = "#ember-testing"; + ENV.APP.rootElement = '#ember-testing'; ENV.APP.autoboot = false; } - if (environment === "production") { + if (environment === 'production') { } return ENV; diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/ember-cli-build.mjs b/dev-packages/e2e-tests/test-applications/ember-vite/ember-cli-build.mjs index 60915b249ba4..3047eaa76724 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/ember-cli-build.mjs +++ b/dev-packages/e2e-tests/test-applications/ember-vite/ember-cli-build.mjs @@ -1,8 +1,8 @@ -import EmberApp from "ember-cli/lib/broccoli/ember-app.js"; -import { compatBuild } from "@embroider/compat"; +import EmberApp from 'ember-cli/lib/broccoli/ember-app.js'; +import { compatBuild } from '@embroider/compat'; export default async function (defaults) { - const { buildOnce } = await import("@embroider/vite"); + const { buildOnce } = await import('@embroider/vite'); const app = new EmberApp(defaults, { tests: false, diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/index.html b/dev-packages/e2e-tests/test-applications/ember-vite/index.html index 071f6142f6ca..c47ee3dc7a4c 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/index.html +++ b/dev-packages/e2e-tests/test-applications/ember-vite/index.html @@ -18,8 +18,8 @@ diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/package.json b/dev-packages/e2e-tests/test-applications/ember-vite/package.json index 66ef0e81439c..a1dff896e46b 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/package.json +++ b/dev-packages/e2e-tests/test-applications/ember-vite/package.json @@ -10,10 +10,14 @@ "doc": "doc", "test": "tests" }, + "exports": { + "./tests/*": "./tests/*", + "./*": "./app/*" + }, "scripts": { - "proxy": "ts-node-script start-event-proxy.ts", + "proxy": "node start-event-proxy.mjs", "build": "vite build", - "start": "ember serve --path dist/ --port 4020", + "start": "vite preview --port 3030", "test": "playwright test", "test:build": "pnpm install && pnpm build", "test:assert": "playwright test", @@ -54,9 +58,8 @@ "ember-resolver": "^13.2.0", "ember-source": "~6.12.0", "testem": "^3.20.0", - "ts-node": "10.9.1", "typescript": "~5.4.5", - "vite": "^8.0.9" + "vite": "^7.0.0" }, "engines": { "node": ">=18" diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/playwright.config.ts b/dev-packages/e2e-tests/test-applications/ember-vite/playwright.config.ts index 734cac1d0e24..fa015b64f79b 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/ember-vite/playwright.config.ts @@ -1,44 +1,10 @@ -import type { PlaywrightTestConfig } from '@playwright/test'; -import { devices } from '@playwright/test'; - -// Fix urls not resolving to localhost on Node v17+ -import { setDefaultResultOrder } from 'dns'; -setDefaultResultOrder('ipv4first'); - -const emberPort = 4020; -const eventProxyPort = 3031; - -const config: PlaywrightTestConfig = { - testDir: './tests', - timeout: 30_000, - expect: { - timeout: 10000, - }, - fullyParallel: false, - workers: 1, - forbidOnly: !!process.env.CI, - retries: 0, - reporter: process.env.CI ? [['list'], ['junit', { outputFile: 'results.junit.xml' }]] : 'list', - use: { - baseURL: `http://localhost:${emberPort}`, - trace: 'on-first-retry', - }, - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - ], - webServer: [ - { - command: 'pnpm ts-node-script start-event-proxy.ts', - port: eventProxyPort, - }, - { - command: `pnpm start`, - port: emberPort, - }, - ], -}; +import { getPlaywrightConfig } from '@sentry-internal/test-utils'; + +const config = getPlaywrightConfig({ + startCommand: 'pnpm start', + eventProxyFile: 'start-event-proxy.mjs', + eventProxyPort: 3031, + port: 3030, +}); export default config; diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/start-event-proxy.ts b/dev-packages/e2e-tests/test-applications/ember-vite/start-event-proxy.mjs similarity index 100% rename from dev-packages/e2e-tests/test-applications/ember-vite/start-event-proxy.ts rename to dev-packages/e2e-tests/test-applications/ember-vite/start-event-proxy.mjs diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/tsconfig.json b/dev-packages/e2e-tests/test-applications/ember-vite/tsconfig.json index 1fede8b160f8..62ca153b20cf 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/tsconfig.json +++ b/dev-packages/e2e-tests/test-applications/ember-vite/tsconfig.json @@ -8,11 +8,6 @@ "ember-vite/*": ["./app/*"], "*": ["./types/*"] }, - "types": [ - "ember-source/types", - "@embroider/core/virtual", - "vite/client", - "@glint/ember-tsc/types" - ] + "types": ["ember-source/types", "@embroider/core/virtual", "vite/client", "@glint/ember-tsc/types"] } } diff --git a/dev-packages/e2e-tests/test-applications/ember-vite/vite.config.mjs b/dev-packages/e2e-tests/test-applications/ember-vite/vite.config.mjs index 8408c6ed1f85..abdbb34158c8 100644 --- a/dev-packages/e2e-tests/test-applications/ember-vite/vite.config.mjs +++ b/dev-packages/e2e-tests/test-applications/ember-vite/vite.config.mjs @@ -1,13 +1,13 @@ -import { defineConfig } from "vite"; -import { extensions, classicEmberSupport, ember } from "@embroider/vite"; -import { babel } from "@rollup/plugin-babel"; +import { defineConfig } from 'vite'; +import { extensions, classicEmberSupport, ember } from '@embroider/vite'; +import { babel } from '@rollup/plugin-babel'; export default defineConfig({ plugins: [ classicEmberSupport(), ember(), babel({ - babelHelpers: "runtime", + babelHelpers: 'runtime', extensions, }), ], diff --git a/packages/ember/.editorconfig b/packages/ember/.editorconfig deleted file mode 100644 index c35a002406b9..000000000000 --- a/packages/ember/.editorconfig +++ /dev/null @@ -1,19 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -indent_style = space -indent_size = 2 - -[*.hbs] -insert_final_newline = false - -[*.{diff,md}] -trim_trailing_whitespace = false diff --git a/packages/ember/.oxlintrc.json b/packages/ember/.oxlintrc.json index 9c0c3060af0f..1f14492e9cbd 100644 --- a/packages/ember/.oxlintrc.json +++ b/packages/ember/.oxlintrc.json @@ -1,18 +1,15 @@ { "$schema": "../../node_modules/oxlint/configuration_schema.json", "extends": ["../../.oxlintrc.base.json"], + "env": { + "browser": true + }, "overrides": [ { - "files": ["vendor/**/*.js"], - "env": { - "browser": true, - "node": false - } - }, - { - "files": ["{addon,app,tests}/**/*.{js,ts,d.ts}"], + "files": ["src/**/*.{js,ts,d.ts}"], "rules": { - "import/no-unresolved": "off" + "import/no-unresolved": "off", + "no-restricted-globals": "off" } } ] diff --git a/packages/ember/.prettierignore b/packages/ember/.prettierignore deleted file mode 100644 index b5f539be6166..000000000000 --- a/packages/ember/.prettierignore +++ /dev/null @@ -1,16 +0,0 @@ -# unconventional js -/blueprints/*/files/ - -# compiled output -/dist/ -/dist-*/ -/declarations/ - -# misc -/coverage/ -pnpm-lock.yaml -config/ember-cli-update.json -*.yaml -*.yml -*.md -*.html diff --git a/packages/ember/.prettierrc.mjs b/packages/ember/.prettierrc.mjs deleted file mode 100644 index 9cc6b3dbcfd3..000000000000 --- a/packages/ember/.prettierrc.mjs +++ /dev/null @@ -1,12 +0,0 @@ -export default { - plugins: ['prettier-plugin-ember-template-tag'], - overrides: [ - { - files: '*.{js,gjs,ts,gts,mjs,mts,cjs,cts}', - options: { - singleQuote: true, - templateSingleQuote: false, - }, - }, - ], -}; diff --git a/packages/ember/.template-lintrc.mjs b/packages/ember/.template-lintrc.mjs deleted file mode 100644 index 8b6625cd9a94..000000000000 --- a/packages/ember/.template-lintrc.mjs +++ /dev/null @@ -1,4 +0,0 @@ -export default { - extends: 'recommended', - checkHbsTemplateLiterals: false, -}; diff --git a/packages/ember/README.md b/packages/ember/README.md index 4d6591650351..9c43e7ba366d 100644 --- a/packages/ember/README.md +++ b/packages/ember/README.md @@ -62,10 +62,10 @@ For automatic performance instrumentation (page loads, navigation, runloop, comp ```typescript // app/instance-initializers/sentry-performance.ts import type ApplicationInstance from '@ember/application/instance'; -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { instrumentAppInstancePerformance } from '@sentry/ember'; export function initialize(appInstance: ApplicationInstance): void { - addIntegration(browserTracingIntegration({ appInstance })); + instrumentAppInstancePerformance(appInstance, optionalOptions); } export default { @@ -75,17 +75,17 @@ export default { ### Performance Options -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `appInstance` | `ApplicationInstance` | *required* | The Ember application instance | -| `disableRunloopPerformance` | `boolean` | `false` | Disable runloop queue tracking | -| `disableInstrumentComponents` | `boolean` | `false` | Disable component render tracking | -| `enableComponentDefinitions` | `boolean` | `false` | Enable component definition tracking | -| `minimumRunloopQueueDuration` | `number` | `5` | Minimum duration (ms) for runloop spans | -| `minimumComponentRenderDuration` | `number` | `2` | Minimum duration (ms) for component spans | -| `instrumentPageLoad` | `boolean` | `true` | Instrument page load spans | -| `instrumentNavigation` | `boolean` | `true` | Instrument navigation spans | -| `idleTimeout` | `number` | `5000` | Idle timeout (ms) for tracing | +| Option | Type | Default | Description | +| -------------------------------- | --------------------- | ---------- | ----------------------------------------- | +| `appInstance` | `ApplicationInstance` | _required_ | The Ember application instance | +| `disableRunloopPerformance` | `boolean` | `false` | Disable runloop queue tracking | +| `disableInstrumentComponents` | `boolean` | `false` | Disable component render tracking | +| `enableComponentDefinitions` | `boolean` | `false` | Enable component definition tracking | +| `minimumRunloopQueueDuration` | `number` | `5` | Minimum duration (ms) for runloop spans | +| `minimumComponentRenderDuration` | `number` | `2` | Minimum duration (ms) for component spans | +| `instrumentPageLoad` | `boolean` | `true` | Instrument page load spans | +| `instrumentNavigation` | `boolean` | `true` | Instrument navigation spans | +| `idleTimeout` | `number` | `5000` | Idle timeout (ms) for tracing | You can also use the convenience function `setupPerformance`: diff --git a/packages/ember/UPGRADE.md b/packages/ember/UPGRADE.md index 7f5ec010dc27..14099538a581 100644 --- a/packages/ember/UPGRADE.md +++ b/packages/ember/UPGRADE.md @@ -6,11 +6,11 @@ This guide covers migrating from the v1 Ember addon format to the v2 addon forma The v2 addon is a modern [Ember v2 addon](https://rfcs.emberjs.com/id/0507-embroider-v2-package-format/) that works with Embroider and Vite. Key differences: -| Feature | v1 Addon | v2 Addon | -|---------|----------|----------| -| Configuration | `config/environment.js` | Direct `Sentry.init()` call | +| Feature | v1 Addon | v2 Addon | +| --------------------------- | --------------------------- | ------------------------------------------------------------ | +| Configuration | `config/environment.js` | Direct `Sentry.init()` call | | Performance instrumentation | Auto-registered initializer | Manual instance-initializer with `browserTracingIntegration` | -| Build compatibility | Classic builds only | Embroider & Vite compatible | +| Build compatibility | Classic builds only | Embroider & Vite compatible | ## Step 1: Update Configuration @@ -73,10 +73,10 @@ In v1, performance instrumentation was automatic. In v2, create an instance-init ```typescript import type ApplicationInstance from '@ember/application/instance'; -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { instrumentAppInstancePerformance } from '@sentry/ember'; export function initialize(appInstance: ApplicationInstance): void { - addIntegration(browserTracingIntegration({ appInstance })); + instrumentAppInstancePerformance(appInstance); } export default { @@ -88,12 +88,10 @@ export default { ```typescript import type ApplicationInstance from '@ember/application/instance'; -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { instrumentAppInstancePerformance } from '@sentry/ember'; export function initialize(appInstance: ApplicationInstance): void { - addIntegration(browserTracingIntegration({ - appInstance, - + instrumentAppInstancePerformance(appInstance, { // Disable runloop queue tracking disableRunloopPerformance: false, @@ -115,7 +113,7 @@ export function initialize(appInstance: ApplicationInstance): void { // Idle timeout (ms) idleTimeout: 5000, - })); + }); } export default { @@ -149,7 +147,7 @@ Most imports remain the same, but check for these changes: ```typescript // v2 - new import for browserTracingIntegration -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { addIntegration, browserTracingIntegration, instrumentAppInstancePerformance } from '@sentry/ember'; // v2 - same for instrumentRoutePerformance import { instrumentRoutePerformance } from '@sentry/ember'; @@ -197,12 +195,14 @@ config/ ``` **app/app.js:** + ```javascript import Application from '@ember/application'; // Sentry was auto-initialized from config ``` **config/environment.js:** + ```javascript module.exports = function (environment) { return { @@ -230,6 +230,7 @@ config/ ``` **app/app.ts:** + ```typescript import Application from '@ember/application'; import Resolver from 'ember-resolver'; @@ -252,12 +253,13 @@ loadInitializers(App, config.modulePrefix); ``` **app/instance-initializers/sentry-performance.ts:** + ```typescript import type ApplicationInstance from '@ember/application/instance'; -import { addIntegration, browserTracingIntegration } from '@sentry/ember'; +import { instrumentAppInstancePerformance } from '@sentry/ember'; export function initialize(appInstance: ApplicationInstance): void { - addIntegration(browserTracingIntegration({ appInstance })); + instrumentAppInstancePerformance(appInstance); } export default { initialize }; @@ -268,6 +270,7 @@ export default { initialize }; ### "Cannot find module '@sentry/ember/performance'" Make sure you're importing from the correct path: + ```typescript import { browserTracingIntegration } from '@sentry/ember'; ``` diff --git a/packages/ember/addon/utils/performance.ts b/packages/ember/addon/utils/performance.ts deleted file mode 100644 index 0cf27396ba81..000000000000 --- a/packages/ember/addon/utils/performance.ts +++ /dev/null @@ -1,80 +0,0 @@ -import type ApplicationInstance from '@ember/application/instance'; -import { _backburner, run } from '@ember/runloop'; -import { getOwnConfig, importSync, isTesting, macroCondition } from '@embroider/macros'; -import { getClient } from '@sentry/browser'; -import { addIntegration, GLOBAL_OBJ } from '@sentry/core'; -import type { ExtendedBackburner } from '@sentry/ember/runloop'; -import type { EmberSentryConfig, GlobalConfig, OwnConfig } from '../types'; -import type { browserTracingIntegration as browserTracingIntegrationType } from './browserTracingIntegration'; - -export function getSentryConfig(): EmberSentryConfig { - const _global = GLOBAL_OBJ as typeof GLOBAL_OBJ & GlobalConfig; - _global.__sentryEmberConfig = _global.__sentryEmberConfig ?? {}; - const environmentConfig = getOwnConfig().sentryConfig; - if (!environmentConfig.sentry) { - environmentConfig.sentry = { - browserTracingOptions: {}, - }; - } - Object.assign(environmentConfig.sentry, _global.__sentryEmberConfig); - return environmentConfig; -} - -export function getBackburner(): Pick { - if (_backburner) { - return _backburner as unknown as Pick; - } - - if ((run as unknown as { backburner?: Pick }).backburner) { - return (run as unknown as { backburner: Pick }).backburner; - } - - return { - on() { - // noop - }, - off() { - // noop - }, - }; -} - -/** - * Utility to register the browser tracing integration and instrument the app instance for performance. - */ -export function instrumentForPerformance(appInstance: ApplicationInstance): void { - const config = getSentryConfig(); - // Maintaining backwards compatibility with config.browserTracingOptions, but passing it with Sentry options is preferred. - const browserTracingOptions = config.browserTracingOptions || config.sentry.browserTracingOptions || {}; - - const { browserTracingIntegration } = importSync('./browserTracingIntegration') as { - browserTracingIntegration: typeof browserTracingIntegrationType; - }; - - const idleTimeout = config.transitionTimeout || 5000; - - const emberSpecificConfig = { - minimumRunloopQueueDuration: config.minimumRunloopQueueDuration, - minimumComponentRenderDuration: config.minimumComponentRenderDuration, - enableComponentDefinitions: config.enableComponentDefinitions, - disableInitialLoadInstrumentation: config.disableInitialLoadInstrumentation, - disableRunloopPerformance: config.disableRunloopPerformance, - disableInstrumentComponents: config.disableInstrumentComponents, - }; - - const browserTracing = browserTracingIntegration({ - appInstance, - idleTimeout, - ...browserTracingOptions, - ...emberSpecificConfig, - }); - - const client = getClient(); - const isAlreadyInitialized = macroCondition(isTesting()) ? client?.getIntegrationByName('BrowserTracing') : false; - addIntegration(browserTracing); - - // Ensure this is re-run in tests even if the integration is already initialized - if (isAlreadyInitialized && client) { - browserTracing.afterAllSetup?.(client); - } -} diff --git a/packages/ember/babel.config.cjs b/packages/ember/babel.config.cjs index fe72f41b2660..60af86e9b87f 100644 --- a/packages/ember/babel.config.cjs +++ b/packages/ember/babel.config.cjs @@ -5,16 +5,8 @@ */ const { buildMacros } = require('@embroider/macros/babel'); -const { - babelCompatSupport, - templateCompatSupport, -} = require('@embroider/compat/babel'); - const macros = buildMacros(); -// For scenario testing -const isCompat = Boolean(process.env.ENABLE_COMPAT_BUILD); - module.exports = { plugins: [ [ @@ -28,9 +20,7 @@ module.exports = { [ 'babel-plugin-ember-template-compilation', { - transforms: [ - ...(isCompat ? templateCompatSupport() : macros.templateMacros), - ], + transforms: [...macros.templateMacros], }, ], [ @@ -41,7 +31,7 @@ module.exports = { }, }, ], - ...(isCompat ? babelCompatSupport() : macros.babelMacros), + ...macros.babelMacros, ], generatorOpts: { diff --git a/packages/ember/config/ember-cli-update.json b/packages/ember/config/ember-cli-update.json index 655e292304fc..ef6bfd6d57a5 100644 --- a/packages/ember/config/ember-cli-update.json +++ b/packages/ember/config/ember-cli-update.json @@ -9,11 +9,7 @@ { "name": "@ember/addon-blueprint", "isBaseBlueprint": true, - "options": [ - "--ci-provider=github", - "--pnpm", - "--typescript" - ] + "options": ["--ci-provider=github", "--pnpm", "--typescript"] } ] } diff --git a/packages/ember/demo-app/templates/replay.gts b/packages/ember/demo-app/templates/replay.gts deleted file mode 100644 index e5929d6b1171..000000000000 --- a/packages/ember/demo-app/templates/replay.gts +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/packages/ember/eslint.config.mjs b/packages/ember/eslint.config.mjs index d947a4d8a720..5ab002822104 100644 --- a/packages/ember/eslint.config.mjs +++ b/packages/ember/eslint.config.mjs @@ -33,14 +33,7 @@ const tsParserOptions = { }; export default defineConfig([ - globalIgnores([ - 'dist/', - 'dist-*/', - 'declarations/', - 'coverage/', - '!**/.*', - '.npm-deps/', - ]), + globalIgnores(['dist/', 'dist-*/', 'declarations/', 'coverage/', '!**/.*', '.npm-deps/']), js.configs.recommended, prettier, ember.configs.base, diff --git a/packages/ember/index.html b/packages/ember/index.html deleted file mode 100644 index 66366871301d..000000000000 --- a/packages/ember/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Demo App - - - - - - - - - - - - - - diff --git a/packages/ember/package.json b/packages/ember/package.json index 2dd848a8a663..26427e0c7cba 100644 --- a/packages/ember/package.json +++ b/packages/ember/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/ember", - "version": "10.52.0", + "version": "10.53.1", "description": "Official Sentry SDK for Ember.js", "keywords": [ "ember-addon" @@ -28,77 +28,38 @@ "scripts": { "build": "rollup --config", "build:dev": "yarn build", - "build:tarball": "yarn build && npm pack", + "build:tarball": "npm pack", "build:watch": "rollup --config --watch", "circularDepCheck": "madge --circular src/index.ts", "clean": "rimraf dist declarations *.tgz .turbo", - "format": "prettier . --cache --write", - "lint": "concurrently \"yarn:lint:*(!fix)\" --names \"lint:\" --prefixColors auto", - "lint:fix": "concurrently \"yarn:lint:*:fix\" --names \"fix:\" --prefixColors auto && yarn format", - "lint:format": "prettier . --cache --check", - "lint:hbs": "ember-template-lint . --no-error-on-unmatched-pattern", - "lint:hbs:fix": "ember-template-lint . --fix --no-error-on-unmatched-pattern", - "lint:js": "eslint . --cache", - "lint:js:fix": "eslint . --fix", - "lint:types": "ember-tsc --noEmit", - "lint:publish": "yarn build && publint run --level error --pack npm", + "lint:fix": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --fix --type-aware", + "lint": "OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint . --type-aware", "prepack": "rollup --config", - "start": "vite dev", - "test": "vite build --mode=development --out-dir dist-tests && testem --file testem.cjs ci --port 0", + "test": "yarn test:unit", + "test:unit": "vitest run", + "test:unit:watch": "vitest --watch", "yalc:publish": "yalc publish --push --sig" }, "dependencies": { "@embroider/addon-shim": "^1.10.2", - "@sentry/browser": "10.52.0", - "@sentry/core": "10.52.0", + "@sentry/browser": "10.53.1", + "@sentry/core": "10.53.1", "decorator-transforms": "^2.3.2" }, "devDependencies": { "@babel/core": "^7.29.0", "@babel/eslint-parser": "^7.28.6", "@babel/plugin-transform-typescript": "^7.28.6", - "@babel/runtime": "^7.29.2", "@ember/app-tsconfig": "^2.0.0", "@ember/library-tsconfig": "^2.0.0", - "@ember/test-helpers": "^5.4.2", - "@ember/test-waiters": "^4.1.1", "@embroider/addon-dev": "^8.3.0", "@embroider/compat": "^4.1.17", "@embroider/core": "^4.4.7", "@embroider/macros": "^1.20.2", "@embroider/vite": "^1.7.2", - "@eslint/js": "^9.39.4", - "@glimmer/component": "^2.1.1", "@glint/ember-tsc": "^1.5.0", - "@glint/template": "^1.7.7", - "@glint/tsserver-plugin": "^2.4.0", "@rollup/plugin-babel": "^7.0.0", - "@types/qunit": "^2.19.13", - "@types/sinon": "^21.0.1", - "babel-plugin-ember-template-compilation": "^4.0.0", - "concurrently": "^9.2.1", - "ember-page-title": "^9.0.3", - "ember-qunit": "^9.0.4", - "ember-source": "^6.12.0", - "ember-strict-application-resolver": "^0.1.1", - "ember-template-lint": "^7.9.3", - "eslint": "^9.39.4", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-ember": "^13.2.1", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-n": "^18.0.1", - "globals": "^17.6.0", - "prettier": "^3.8.3", - "prettier-plugin-ember-template-tag": "^2.1.6", - "publint": "^0.3.20", - "qunit": "^2.25.0", - "qunit-dom": "^3.5.1", - "rollup": "^4.60.3", - "sinon": "^22.0.0", - "testem": "^3.20.0", - "typescript": "~5.9.3", - "typescript-eslint": "^8.59.2", - "vite": "^8.0.11" + "ember-source": "^6.12.0" }, "engines": { "node": ">=18" @@ -116,5 +77,20 @@ "version": 2, "type": "addon", "main": "addon-main.cjs" + }, + "nx": { + "targets": { + "build:transpile": { + "dependsOn": [ + "^build:transpile", + "^build:types" + ], + "outputs": [ + "{projectRoot}/dist", + "{projectRoot}/**/*.d.ts", + "{projectRoot}/declarations/*.d.ts.map" + ] + } + } } } diff --git a/packages/ember/src/index.ts b/packages/ember/src/index.ts index 6c63607cee38..d0a3012ff128 100644 --- a/packages/ember/src/index.ts +++ b/packages/ember/src/index.ts @@ -7,11 +7,7 @@ // Re-export everything from @sentry/browser export * from '@sentry/browser'; -export { init } from './utils/sentry/init.ts'; -export { instrumentRoutePerformance } from './utils/sentry/instrument-route-performance.ts'; -export { - _resetGlobalInstrumentation, - browserTracingIntegration, - setupPerformance, -} from './utils/sentry/setup-performance.ts'; -export type { EmberBrowserTracingOptions } from './utils/sentry/setup-performance.ts'; +// Sentry-specific utilities +export { init } from './init.ts'; +export { instrumentRoutePerformance } from './utils/instrumentRoutePerformance.ts'; +export { browserTracingIntegration, instrumentAppInstancePerformance } from './utils/browserTracingIntegration.ts'; diff --git a/packages/ember/src/utils/sentry/init.ts b/packages/ember/src/init.ts similarity index 100% rename from packages/ember/src/utils/sentry/init.ts rename to packages/ember/src/init.ts diff --git a/packages/ember/addon/utils/browserTracingIntegration.ts b/packages/ember/src/utils/browserTracingIntegration.ts similarity index 65% rename from packages/ember/addon/utils/browserTracingIntegration.ts rename to packages/ember/src/utils/browserTracingIntegration.ts index 67d04da01ce2..cc52009e5b0f 100644 --- a/packages/ember/addon/utils/browserTracingIntegration.ts +++ b/packages/ember/src/utils/browserTracingIntegration.ts @@ -1,17 +1,17 @@ import { + addIntegration, browserTracingIntegration as originalBrowserTracingIntegration, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan, } from '@sentry/browser'; -import { consoleSandbox, type Integration } from '@sentry/core'; +import type { Integration } from '@sentry/core'; import type ApplicationInstance from '@ember/application/instance'; -import { instrumentEmberAppInstanceForPerformance } from './instrumentEmberAppInstanceForPerformance'; -import { instrumentGlobalsForPerformance } from './instrumentEmberGlobals'; +import { instrumentEmberAppInstanceForPerformance } from './instrumentEmberAppInstanceForPerformance.ts'; +import { instrumentGlobalsForPerformance } from './instrumentEmberGlobals.ts'; import { isTesting, macroCondition } from '@embroider/macros'; type EmberBrowserTracingIntegrationOptions = Parameters[0] & { - // TODO(v11): make this required - appInstance?: ApplicationInstance; + appInstance: ApplicationInstance; disableRunloopPerformance?: boolean; minimumRunloopQueueDuration?: number; disableInstrumentComponents?: boolean; @@ -42,9 +42,9 @@ export function browserTracingIntegration(options: EmberBrowserTracingIntegratio const globalsPerformanceConfig = { disableRunloopPerformance: options.disableRunloopPerformance ?? false, - minimumRunloopQueueDuration: options.minimumRunloopQueueDuration, + minimumRunloopQueueDuration: options.minimumRunloopQueueDuration ?? 0, disableInstrumentComponents: options.disableInstrumentComponents ?? false, - minimumComponentRenderDuration: options.minimumComponentRenderDuration, + minimumComponentRenderDuration: options.minimumComponentRenderDuration ?? 0, enableComponentDefinitions: options.enableComponentDefinitions ?? false, disableInitialLoadInstrumentation: options.disableInitialLoadInstrumentation ?? false, }; @@ -54,34 +54,38 @@ export function browserTracingIntegration(options: EmberBrowserTracingIntegratio afterAllSetup(client) { integration.afterAllSetup(client); - // Run this in the next tick to ensure the ember router etc. is properly initialized + instrumentEmberAppInstanceForPerformance( + client, + appInstance, + appInstancePerformanceConfig, + startBrowserTracingPageLoadSpan, + startBrowserTracingNavigationSpan, + ); - setTimeout(() => { - if (appInstance) { - instrumentEmberAppInstanceForPerformance( - client, - appInstance, - appInstancePerformanceConfig, - startBrowserTracingPageLoadSpan, - startBrowserTracingNavigationSpan, - ); - } else { - consoleSandbox(() => { - // eslint-disable-next-line no-console - console.warn('Skipping router instrumentation because appInstance is not provided.'); - }); + // We only want to run this once in tests! + if (macroCondition(isTesting())) { + if (_initialized) { + return; } + } - // We only want to run this once in tests! - if (macroCondition(isTesting())) { - if (_initialized) { - return; - } - } - - instrumentGlobalsForPerformance(globalsPerformanceConfig); - _initialized = true; - }); + instrumentGlobalsForPerformance(globalsPerformanceConfig); + _initialized = true; }, }; } + +/** + * Utility to simplify adding the browser tracing integration to an app instance. + */ +export function instrumentAppInstancePerformance( + appInstance: ApplicationInstance, + options?: Partial[0]>, +): void { + addIntegration( + browserTracingIntegration({ + ...options, + appInstance, + }), + ); +} diff --git a/packages/ember/src/utils/ember/router.ts b/packages/ember/src/utils/ember/router.ts deleted file mode 100644 index 9c70437e4e12..000000000000 --- a/packages/ember/src/utils/ember/router.ts +++ /dev/null @@ -1,73 +0,0 @@ -import type RouterService from '@ember/routing/router-service'; -import type Transition from '@ember/routing/transition'; - -export interface EmberRouterMain { - location: { - formatURL?: (url: string) => string; - getURL?: () => string; - implementation?: string; - rootURL: string; - }; -} - -/** - * @private - * - * Get the current URL from the Ember router location. - */ -export function getLocationURL(location: EmberRouterMain['location']): string { - if (!location?.getURL || !location?.formatURL) { - return ''; - } - - const url = location.formatURL(location.getURL()); - - // `implementation` is optional in Ember's predefined location types, so we also check if the URL starts with '#'. - if (location.implementation === 'hash' || url.startsWith('#')) { - return `${location.rootURL}${url}`; - } - - return url; -} - -/** - * @private - */ -export function getTransitionInformation( - transition: Transition, - router: RouterService, -): { - fromRoute: string | undefined; - toRoute: string | undefined; -} { - const fromRoute = transition?.from?.name as string | undefined; - - const toRoute = - (transition?.to?.name as string | undefined) ?? - router.currentRouteName ?? - undefined; - - return { - fromRoute, - toRoute, - }; -} - -/** - * @private - */ -export function isTransitionIntermediate(transition: Transition): boolean { - // We want to use ignore, as this may actually be defined on new versions - const isIntermediate: boolean | undefined = transition.isIntermediate; - - if (typeof isIntermediate === 'boolean') { - return isIntermediate; - } - - // For versions without this, we look if the route is a `.loading` or `.error` route - // This is not perfect and may false-positive in some cases, but it's the best we can do - return ( - transition.to?.localName === 'loading' || - transition.to?.localName === 'error' - ); -} diff --git a/packages/ember/addon/utils/instrumentEmberAppInstanceForPerformance.ts b/packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts similarity index 56% rename from packages/ember/addon/utils/instrumentEmberAppInstanceForPerformance.ts rename to packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts index c10e3913b4ef..f81a274570b9 100644 --- a/packages/ember/addon/utils/instrumentEmberAppInstanceForPerformance.ts +++ b/packages/ember/src/utils/instrumentEmberAppInstanceForPerformance.ts @@ -1,14 +1,27 @@ import type ApplicationInstance from '@ember/application/instance'; -import type Transition from '@ember/routing/-private/transition'; +import type Transition from '@ember/routing/transition'; import type RouterService from '@ember/routing/router-service'; import type { startBrowserTracingNavigationSpan as startBrowserTracingNavigationSpanType, startBrowserTracingPageLoadSpan as startBrowserTracingPageLoadSpanType, } from '@sentry/browser'; -import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, startInactiveSpan } from '@sentry/browser'; -import type { Client, Span } from '@sentry/core'; -import type { EmberRouterMain } from '../types'; -import { getBackburner } from './performance'; +import { + SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, + SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + startInactiveSpan, + WINDOW, +} from '@sentry/browser'; +import { getCurrentScope, spanToJSON, type Client, type Span } from '@sentry/core'; +import { getBackburner } from './utils.ts'; + +interface EmberRouterMain { + location: { + formatURL?: (url: string) => string; + getURL?: () => string; + implementation?: string; + rootURL: string; + }; +} export function instrumentEmberAppInstanceForPerformance( client: Client, @@ -17,17 +30,9 @@ export function instrumentEmberAppInstanceForPerformance( startBrowserTracingPageLoadSpan: typeof startBrowserTracingPageLoadSpanType, startBrowserTracingNavigationSpan: typeof startBrowserTracingNavigationSpanType, ): void { - // eslint-disable-next-line ember/no-private-routing-service - const routerMain = appInstance.lookup('router:main') as EmberRouterMain; - let routerService = appInstance.lookup('service:router') as RouterService & { - externalRouter?: RouterService; - _hasMountedSentryPerformanceRouting?: boolean; - }; + const { disableRunloopPerformance, instrumentPageLoad, instrumentNavigation } = config; + const routerService = getRouterService(appInstance); - if (routerService.externalRouter) { - // Using ember-engines-router-service in an engine. - routerService = routerService.externalRouter; - } if (routerService._hasMountedSentryPerformanceRouting) { // Routing listens to route changes on the main router, and should not be initialized multiple times per page. return; @@ -37,67 +42,26 @@ export function instrumentEmberAppInstanceForPerformance( return; } - routerService._hasMountedSentryPerformanceRouting = true; - _instrumentEmberRouter( - client, - routerService, - routerMain, - config, - startBrowserTracingPageLoadSpan, - startBrowserTracingNavigationSpan, - ); -} - -function getTransitionInformation( - transition: Transition | undefined, - router: RouterService, -): { fromRoute?: string; toRoute?: string } { - const fromRoute = transition?.from?.name; - const toRoute = transition?.to?.name || router.currentRouteName; - return { - fromRoute, - toRoute, - }; -} - -// Only exported for testing -export function _getLocationURL(location: EmberRouterMain['location']): string { - if (!location?.getURL || !location?.formatURL) { - return ''; - } - const url = location.formatURL(location.getURL()); - - // `implementation` is optional in Ember's predefined location types, so we also check if the URL starts with '#'. - if (location.implementation === 'hash' || url.startsWith('#')) { - return `${location.rootURL}${url}`; - } - return url; -} - -function _instrumentEmberRouter( - client: Client, - routerService: RouterService, - routerMain: EmberRouterMain, - config: { disableRunloopPerformance?: boolean; instrumentPageLoad?: boolean; instrumentNavigation?: boolean }, - startBrowserTracingPageLoadSpan: typeof startBrowserTracingPageLoadSpanType, - startBrowserTracingNavigationSpan: typeof startBrowserTracingNavigationSpanType, -): void { - const { disableRunloopPerformance, instrumentPageLoad, instrumentNavigation } = config; + const routerMain = getRouterMain(appInstance); const location = routerMain.location; let activeRootSpan: Span | undefined; let transitionSpan: Span | undefined; const url = _getLocationURL(location); - if (url && instrumentPageLoad !== false) { - const routeInfo = routerService.recognize(url); + if (instrumentPageLoad !== false) { + // Somehow the router service etc. may not be fully ready/initialized yet at this point + // Probably because we are running this before the Ember setup is necessarily completed + // So in order to accomodate this, we fall back to starting the pageload span with the current URL and update it later + const routeInfo = url ? routerService.recognize(url) : undefined; + activeRootSpan = startBrowserTracingPageLoadSpan(client, { - name: `route:${routeInfo.name}`, + name: routeInfo ? `route:${routeInfo.name}` : url || WINDOW.location.pathname, attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route', + [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeInfo ? 'route' : 'url', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.ember', url, - toRoute: routeInfo.name, + toRoute: routeInfo?.name, }, }); } @@ -110,29 +74,51 @@ function _instrumentEmberRouter( getBackburner().off('end', finishActiveTransaction); }; - if (instrumentNavigation === false) { - return; - } - routerService.on('routeWillChange', (transition: Transition) => { const { fromRoute, toRoute } = getTransitionInformation(transition, routerService); + // Store this here to be used, even if the active span has ended + getCurrentScope().setTransactionName(`route:${toRoute}`); + // We want to ignore loading && error routes if (transitionIsIntermediate(transition)) { return; } - activeRootSpan?.end(); + // If this is not the initial transition, we want to end the active root span and start a new one + if (fromRoute != null) { + activeRootSpan?.end(); + + if (instrumentNavigation !== false) { + activeRootSpan = startBrowserTracingNavigationSpan(client, { + name: `route:${toRoute}`, + attributes: { + [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route', + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.ember', + fromRoute, + toRoute, + }, + }); + } + } else if (activeRootSpan && spanToJSON(activeRootSpan).data[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'url') { + // We make sure to update the pageload span with the current URL, if we couldn't get it before + // In this case we re-load the router:main reference, as this may change and we may have a stale reference + const location = getRouterMain(appInstance).location; + const url = _getLocationURL(location); + if (url) { + activeRootSpan.updateName(`route:${toRoute}`); + activeRootSpan.setAttributes({ + [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route', + url, + toRoute: toRoute, + }); + } + } - activeRootSpan = startBrowserTracingNavigationSpan(client, { - name: `route:${toRoute}`, - attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route', - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.ember', - fromRoute, - toRoute, - }, - }); + // transition spans are only emitted if instrumentNavigation is true + if (instrumentNavigation === false) { + return; + } transitionSpan = startInactiveSpan({ attributes: { @@ -159,6 +145,53 @@ function _instrumentEmberRouter( }); } +function getRouterService( + appInstance: ApplicationInstance, +): RouterService & { _hasMountedSentryPerformanceRouting?: boolean } { + const routerService = appInstance.lookup('service:router') as RouterService & { + externalRouter?: RouterService; + _hasMountedSentryPerformanceRouting?: boolean; + }; + + if (routerService.externalRouter) { + // Using ember-engines-router-service in an engine. + return routerService.externalRouter; + } + + return routerService; +} + +function getRouterMain(appInstance: ApplicationInstance): EmberRouterMain { + return appInstance.lookup('router:main') as EmberRouterMain; +} + +function getTransitionInformation( + transition: Transition | undefined, + router: RouterService, +): { fromRoute?: string; toRoute?: string } { + const fromRoute = transition?.from?.name; + const toRoute = transition?.to?.name ?? router.currentRouteName ?? undefined; + + return { + fromRoute, + toRoute, + }; +} + +// Only exported for testing +export function _getLocationURL(location: EmberRouterMain['location']): string { + if (!location?.getURL || !location?.formatURL) { + return ''; + } + const url = location.formatURL(location.getURL()); + + // `implementation` is optional in Ember's predefined location types, so we also check if the URL starts with '#'. + if (location.implementation === 'hash' || url.startsWith('#')) { + return `${location.rootURL}${url}`; + } + return url; +} + function transitionIsIntermediate(transition: Transition): boolean { // We want to use ignore, as this may actually be defined on new versions // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/packages/ember/addon/utils/instrumentEmberGlobals.ts b/packages/ember/src/utils/instrumentEmberGlobals.ts similarity index 86% rename from packages/ember/addon/utils/instrumentEmberGlobals.ts rename to packages/ember/src/utils/instrumentEmberGlobals.ts index 02e365e27c23..58ecdefe9bb1 100644 --- a/packages/ember/addon/utils/instrumentEmberGlobals.ts +++ b/packages/ember/src/utils/instrumentEmberGlobals.ts @@ -1,10 +1,12 @@ import { subscribe } from '@ember/instrumentation'; import { scheduleOnce } from '@ember/runloop'; -import type { EmberRunQueues } from '@ember/runloop/-private/types'; import { getActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startInactiveSpan } from '@sentry/browser'; import type { Span } from '@sentry/core'; import { browserPerformanceTimeOrigin, timestampInSeconds } from '@sentry/core'; -import { getBackburner } from './performance'; +import { getBackburner } from './utils.ts'; + +// Ember runloop queue names +type EmberRunQueues = 'actions' | 'afterRender' | 'destroy' | 'render' | 'routerTransitions' | 'sync'; type Payload = { containerKey: string; @@ -172,23 +174,33 @@ function _instrumentComponents(config: { const beforeComponentDefinitionEntries = {} as RenderEntries; function _subscribeToRenderEvents(): void { - subscribe('render.component', { - before(_name: string, _timestamp: number, payload: Payload) { - processComponentRenderBefore(payload, beforeEntries); + subscribe('render.component', { + before(_name: string, _timestamp: number, payload: object) { + processComponentRenderBefore(payload as Payload, beforeEntries); }, - after(_name: string, _timestamp: number, payload: Payload, _beganIndex: number) { - processComponentRenderAfter(payload, beforeEntries, 'ui.ember.component.render', minComponentDuration); + after(_name: string, _timestamp: number, payload: object) { + processComponentRenderAfter( + payload as Payload, + beforeEntries, + 'ui.ember.component.render', + minComponentDuration, + ); }, }); if (enableComponentDefinitions) { - subscribe('render.getComponentDefinition', { - before(_name: string, _timestamp: number, payload: Payload) { - processComponentRenderBefore(payload, beforeComponentDefinitionEntries); + subscribe('render.getComponentDefinition', { + before(_name: string, _timestamp: number, payload: object) { + processComponentRenderBefore(payload as Payload, beforeComponentDefinitionEntries); }, - after(_name: string, _timestamp: number, payload: Payload, _beganIndex: number) { - processComponentRenderAfter(payload, beforeComponentDefinitionEntries, 'ui.ember.component.definition', 0); + after(_name: string, _timestamp: number, payload: object) { + processComponentRenderAfter( + payload as Payload, + beforeComponentDefinitionEntries, + 'ui.ember.component.definition', + 0, + ); }, }); } diff --git a/packages/ember/src/utils/sentry/instrument-route-performance.ts b/packages/ember/src/utils/instrumentRoutePerformance.ts similarity index 86% rename from packages/ember/src/utils/sentry/instrument-route-performance.ts rename to packages/ember/src/utils/instrumentRoutePerformance.ts index b197c75f933e..81ceb4349a37 100644 --- a/packages/ember/src/utils/sentry/instrument-route-performance.ts +++ b/packages/ember/src/utils/instrumentRoutePerformance.ts @@ -1,15 +1,10 @@ import { startSpan } from '@sentry/browser'; -import { - SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, - SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, -} from '@sentry/core'; +import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core'; import type Route from '@ember/routing/route'; import type { TransactionSource } from '@sentry/core'; -type RouteConstructor = new ( - ...args: ConstructorParameters -) => Route; +type RouteConstructor = new (...args: ConstructorParameters) => Route; /** * Enables monitoring the performance of an Ember app. @@ -34,9 +29,7 @@ type RouteConstructor = new ( * export default instrumentRoutePerformance(ApplicationRoute); * ``` */ -export function instrumentRoutePerformance( - BaseRoute: T, -): T { +export function instrumentRoutePerformance(BaseRoute: T): T { const instrumentFunction = async ( op: string, name: string, @@ -77,13 +70,7 @@ export function instrumentRoutePerformance( } public async model(...args: unknown[]): Promise { - return instrumentFunction( - 'ui.ember.route.model', - this.fullRouteName, - super.model.bind(this), - args, - 'custom', - ); + return instrumentFunction('ui.ember.route.model', this.fullRouteName, super.model.bind(this), args, 'custom'); } public afterModel(...args: unknown[]): void | Promise { diff --git a/packages/ember/src/utils/sentry/setup-performance.ts b/packages/ember/src/utils/sentry/setup-performance.ts deleted file mode 100644 index b238f4b9f27a..000000000000 --- a/packages/ember/src/utils/sentry/setup-performance.ts +++ /dev/null @@ -1,552 +0,0 @@ -import { subscribe, unsubscribe } from '@ember/instrumentation'; -import { _backburner, run, scheduleOnce } from '@ember/runloop'; -import { - browserTracingIntegration as originalBrowserTracingIntegration, - getActiveSpan, - startBrowserTracingNavigationSpan, - startBrowserTracingPageLoadSpan, - SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, - SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, - startInactiveSpan, -} from '@sentry/browser'; -import { - addIntegration, - timestampInSeconds, -} from '@sentry/core'; -import { - getLocationURL, - getTransitionInformation, - isTransitionIntermediate, -} from '../ember/router.ts'; - -import type ApplicationInstance from '@ember/application/instance'; -import type RouterService from '@ember/routing/router-service'; -import type { BrowserClient } from '@sentry/browser'; -import type { Integration, Span } from '@sentry/core'; -import type { EmberRouterMain } from '../ember/router.ts'; - -// Module-level flag to prevent duplicate global listeners (runloop, components) -// from accumulating across repeated setupPerformance calls (e.g., in tests or ember-engines). -let _isGlobalInstrumentationInitialized = false; - -// Cleanup functions for global listeners registered by _instrumentEmberRunloop -// and _instrumentComponents, so they can be torn down on reset. -const _globalCleanupFns: Array<() => void> = []; - -/** - * Reset the global instrumentation state and unsubscribe accumulated listeners. - * Intended for test teardown only. - * @internal - */ -export function _resetGlobalInstrumentation(): void { - _isGlobalInstrumentationInitialized = false; - for (const cleanup of _globalCleanupFns) { - cleanup(); - } - _globalCleanupFns.length = 0; -} - -// Ember runloop queue names -type EmberRunQueues = - | 'actions' - | 'afterRender' - | 'destroy' - | 'render' - | 'routerTransitions' - | 'sync'; - -/** - * Extended Backburner interface with the 'off' method that's not in the public types. - */ -interface ExtendedBackburner { - on(eventName: string, callback: (...args: unknown[]) => void): void; - off(eventName: string, callback: (...args: unknown[]) => void): void; -} - -/** - * Options for the Ember-specific browserTracingIntegration. - */ -export interface EmberBrowserTracingOptions extends Omit[0], 'instrumentNavigation' | 'instrumentPageLoad'> { - /** - * The Ember ApplicationInstance, required for router instrumentation. - */ - appInstance: ApplicationInstance; - - /** - * Whether to disable component render tracking. - * @default false - */ - disableInstrumentComponents?: boolean; - - /** - * Whether to disable runloop performance tracking. - * @default false - */ - disableRunloopPerformance?: boolean; - - /** - * Whether to enable component definition tracking. - * @default false - */ - enableComponentDefinitions?: boolean; - - /** - * The time (ms) that has to pass without any span being created. - * If this time is exceeded, the idle span will finish. - * @default 5000 - */ - idleTimeout?: number; - - /** - * Whether to instrument navigation spans. - * @default true - */ - instrumentNavigation?: boolean; - - /** - * Whether to instrument page load spans. - * @default true - */ - instrumentPageLoad?: boolean; - - /** - * Minimum duration (ms) for component render spans to be recorded. - * @default 2 - */ - minimumComponentRenderDuration?: number; - - /** - * Minimum duration (ms) for runloop queue spans to be recorded. - * @default 5 - */ - minimumRunloopQueueDuration?: number; -} - -function getBackburner(): Pick { - if (_backburner) { - return _backburner as unknown as Pick; - } - - if ( - (run as unknown as { backburner?: Pick }) - .backburner - ) { - return ( - run as unknown as { backburner: Pick } - ).backburner; - } - - return { - on() { - // noop - }, - off() { - // noop - }, - }; -} - -function _instrumentEmberRouter( - routerService: RouterService, - routerMain: EmberRouterMain, - client: BrowserClient, - options: { - disableRunloopPerformance?: boolean; - instrumentNavigation?: boolean; - instrumentPageLoad?: boolean; - }, -): void { - const { disableRunloopPerformance } = options; - const location = routerMain.location; - let activeRootSpan: Span | undefined; - let transitionSpan: Span | undefined; - - const url = getLocationURL(location); - - if (url && options.instrumentPageLoad !== false) { - let routeInfo; - try { - routeInfo = routerService.recognize(url); - } catch { - // Fall through — skip page load span but continue with router instrumentation - } - if (routeInfo) { - activeRootSpan = startBrowserTracingPageLoadSpan(client, { - name: `route:${routeInfo.name}`, - attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route', - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.ember', - url, - toRoute: routeInfo.name, - }, - }); - } - } - - function createFinishActiveTransaction( - spanToFinish: Span, - ): (_: unknown, nextInstance: unknown) => void { - const handler = (_: unknown, nextInstance: unknown): void => { - if (nextInstance) { - return; - } - spanToFinish.end(); - getBackburner().off('end', handler); - }; - return handler; - } - - if (options.instrumentNavigation === false) { - return; - } - - routerService.on('routeWillChange', (transition) => { - const { fromRoute, toRoute } = getTransitionInformation( - transition, - routerService, - ); - - // We want to ignore loading && error routes - if (isTransitionIntermediate(transition)) { - return; - } - - activeRootSpan?.end(); - transitionSpan?.end(); - - activeRootSpan = startBrowserTracingNavigationSpan(client, { - name: `route:${toRoute}`, - attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route', - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.ember', - fromRoute, - toRoute, - }, - }); - - transitionSpan = startInactiveSpan({ - attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.ember', - }, - op: 'ui.ember.transition', - name: `route:${fromRoute} -> route:${toRoute}`, - onlyIfParent: true, - }); - }); - - routerService.on('routeDidChange', (transition) => { - if ( - !transitionSpan || - !activeRootSpan || - isTransitionIntermediate(transition) - ) { - return; - } - transitionSpan.end(); - - if (disableRunloopPerformance) { - activeRootSpan.end(); - return; - } - - getBackburner().on('end', createFinishActiveTransaction(activeRootSpan)); - }); -} - -function _instrumentEmberRunloop(options: { disableRunloopPerformance?: boolean; minimumRunloopQueueDuration?: number }): void { - const { disableRunloopPerformance, minimumRunloopQueueDuration } = options; - if (disableRunloopPerformance) { - return; - } - - let currentQueueStart: number | undefined; - const instrumentedEmberQueues = [ - 'actions', - 'routerTransitions', - 'render', - 'afterRender', - 'destroy', - ] as EmberRunQueues[]; - - const beginHandler = (_: unknown, previousInstance: unknown): void => { - if (previousInstance) { - return; - } - const activeSpan = getActiveSpan(); - if (!activeSpan) { - return; - } - currentQueueStart = timestampInSeconds(); - - const processQueue = (queue: EmberRunQueues): void => { - // Process this queue using the end of the previous queue. - if (currentQueueStart) { - const now = timestampInSeconds(); - const minQueueDuration = minimumRunloopQueueDuration ?? 5; - - if ((now - currentQueueStart) * 1000 >= minQueueDuration) { - startInactiveSpan({ - attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.ember', - }, - name: 'runloop', - op: `ui.ember.runloop.${queue}`, - startTime: currentQueueStart, - onlyIfParent: true, - })?.end(now); - } - currentQueueStart = undefined; - } - - // Setup for next queue - - const stillActiveSpan = getActiveSpan(); - if (!stillActiveSpan) { - return; - } - currentQueueStart = timestampInSeconds(); - }; - - instrumentedEmberQueues.forEach((queue) => { - // eslint-disable-next-line ember/no-runloop -- scheduleOnce is the only way to instrument Ember's backburner queues - scheduleOnce(queue, null, processQueue, queue); - }); - }; - - getBackburner().on('begin', beginHandler); - _globalCleanupFns.push(() => getBackburner().off('begin', beginHandler)); -} - -type Payload = { - containerKey: string; - initialRender: true; - object: string; -}; - -type RenderEntry = { - payload: Payload; - now: number; -}; - -interface RenderEntries { - [name: string]: RenderEntry; -} - -function processComponentRenderBefore( - payload: Payload, - beforeEntries: RenderEntries, -): void { - const info = { - payload, - now: timestampInSeconds(), - }; - beforeEntries[payload.object] = info; -} - -function processComponentRenderAfter( - payload: Payload, - beforeEntries: RenderEntries, - op: string, - minComponentDuration: number, -): void { - const begin = beforeEntries[payload.object]; - delete beforeEntries[payload.object]; - - if (!begin) { - return; - } - - const now = timestampInSeconds(); - const componentRenderDuration = now - begin.now; - - if (componentRenderDuration * 1000 >= minComponentDuration) { - startInactiveSpan({ - name: payload.containerKey || payload.object, - op, - startTime: begin.now, - attributes: { - [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.ember', - }, - onlyIfParent: true, - })?.end(now); - } -} - -function _instrumentComponents(options: { disableInstrumentComponents?: boolean; minimumComponentRenderDuration?: number; enableComponentDefinitions?: boolean }): void { - const { - disableInstrumentComponents, - minimumComponentRenderDuration, - enableComponentDefinitions, - } = options; - if (disableInstrumentComponents) { - return; - } - - const minComponentDuration = minimumComponentRenderDuration ?? 2; - - const beforeEntries = {} as RenderEntries; - const beforeComponentDefinitionEntries = {} as RenderEntries; - - function _subscribeToRenderEvents(): void { - const renderSub = subscribe('render.component', { - before(_name: string, _timestamp: number, payload: object) { - processComponentRenderBefore(payload as Payload, beforeEntries); - }, - - after(_name: string, _timestamp: number, payload: object) { - processComponentRenderAfter( - payload as Payload, - beforeEntries, - 'ui.ember.component.render', - minComponentDuration, - ); - }, - }); - _globalCleanupFns.push(() => unsubscribe(renderSub)); - - if (enableComponentDefinitions) { - const defSub = subscribe('render.getComponentDefinition', { - before(_name: string, _timestamp: number, payload: object) { - processComponentRenderBefore( - payload as Payload, - beforeComponentDefinitionEntries, - ); - }, - - after(_name: string, _timestamp: number, payload: object) { - processComponentRenderAfter( - payload as Payload, - beforeComponentDefinitionEntries, - 'ui.ember.component.definition', - 0, - ); - }, - }); - _globalCleanupFns.push(() => unsubscribe(defSub)); - } - } - _subscribeToRenderEvents(); -} - -/** - * A custom `browserTracingIntegration` for Ember.js applications. - * - * This wraps the standard browser tracing integration with Ember-specific - * router instrumentation, runloop tracking, and component render tracking. - * - * @param options - Ember browser tracing options including `appInstance` - * @returns A Sentry integration - * - * @example - * ```typescript - * // app/instance-initializers/sentry-performance.ts - * import type ApplicationInstance from '@ember/application/instance'; - * import { browserTracingIntegration, addIntegration } from '@sentry/ember'; - * - * export function initialize(appInstance: ApplicationInstance): void { - * addIntegration(browserTracingIntegration({ appInstance })); - * } - * - * export default { initialize }; - * ``` - */ -export function browserTracingIntegration(options: EmberBrowserTracingOptions): Integration { - const { - appInstance, - disableInstrumentComponents, - disableRunloopPerformance, - enableComponentDefinitions, - instrumentNavigation = true, - instrumentPageLoad = true, - minimumComponentRenderDuration, - minimumRunloopQueueDuration, - idleTimeout = 5000, - ...baseBrowserTracingOptions - } = options; - - const integration = originalBrowserTracingIntegration({ - ...baseBrowserTracingOptions, - idleTimeout, - instrumentNavigation: false, - instrumentPageLoad: false, - }); - - return { - ...integration, - afterAllSetup(client) { - integration.afterAllSetup(client); - - // Disable in fastboot - we only want to run Sentry client-side - const fastboot = appInstance.lookup('service:fastboot') as unknown as - | { isFastBoot: boolean } - | undefined; - if (fastboot?.isFastBoot) { - return; - } - - // Instrument global singletons (runloop, components) independently - // of router state — these should work even if the router is unavailable. - if (!_isGlobalInstrumentationInitialized) { - _isGlobalInstrumentationInitialized = true; - _instrumentEmberRunloop({ disableRunloopPerformance, minimumRunloopQueueDuration }); - _instrumentComponents({ disableInstrumentComponents, minimumComponentRenderDuration, enableComponentDefinitions }); - } - - // eslint-disable-next-line ember/no-private-routing-service - const routerMain = appInstance.lookup('router:main') as EmberRouterMain; - let routerService = appInstance.lookup('service:router') as RouterService & { - externalRouter?: RouterService; - _hasMountedSentryPerformanceRouting?: boolean; - }; - - if (routerService.externalRouter) { - // Using ember-engines-router-service in an engine. - routerService = routerService.externalRouter; - } - if (routerService._hasMountedSentryPerformanceRouting) { - // Routing listens to route changes on the main router, and should not be initialized multiple times per page. - return; - } - if (!routerService.recognize) { - // Router is missing critical functionality to limit cardinality of the transaction names. - return; - } - - routerService._hasMountedSentryPerformanceRouting = true; - _instrumentEmberRouter(routerService, routerMain, client as BrowserClient, { - disableRunloopPerformance, - instrumentNavigation, - instrumentPageLoad, - }); - }, - }; -} - -/** - * Set up Sentry performance instrumentation for an Ember application. - * - * This is a convenience function that creates and adds the Ember - * `browserTracingIntegration`. For more control, use the integration directly. - * - * @param appInstance - The Ember ApplicationInstance - * @param options - Performance instrumentation options - * - * @example - * ```typescript - * // app/instance-initializers/sentry-performance.ts - * import type ApplicationInstance from '@ember/application/instance'; - * import { setupPerformance } from '@sentry/ember'; - * - * export function initialize(appInstance: ApplicationInstance): void { - * setupPerformance(appInstance); - * } - * - * export default { initialize }; - * ``` - */ -export function setupPerformance( - appInstance: ApplicationInstance, - options: Omit = {}, -): void { - addIntegration(browserTracingIntegration({ appInstance, ...options })); -} diff --git a/packages/ember/src/utils/utils.ts b/packages/ember/src/utils/utils.ts new file mode 100644 index 000000000000..464c2806fcb6 --- /dev/null +++ b/packages/ember/src/utils/utils.ts @@ -0,0 +1,25 @@ +import { _backburner, run } from '@ember/runloop'; + +interface ExtendedBackburner { + on(eventName: string, callback: (...args: unknown[]) => void): void; + off(eventName: string, callback: (...args: unknown[]) => void): void; +} + +export function getBackburner(): Pick { + if (_backburner) { + return _backburner as unknown as Pick; + } + + if ((run as unknown as { backburner?: Pick }).backburner) { + return (run as unknown as { backburner: Pick }).backburner; + } + + return { + on() { + // noop + }, + off() { + // noop + }, + }; +} diff --git a/packages/ember/testem.cjs b/packages/ember/testem.cjs deleted file mode 100644 index 9c064583c441..000000000000 --- a/packages/ember/testem.cjs +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -if (typeof module !== 'undefined') { - module.exports = { - test_page: 'tests/index.html?hidepassed', - cwd: 'dist-tests', - disable_watching: true, - launch_in_ci: ['Chrome'], - launch_in_dev: ['Chrome'], - browser_start_timeout: 120, - browser_args: { - Chrome: { - ci: [ - // --no-sandbox is needed when running Chrome inside a container - process.env.CI ? '--no-sandbox' : null, - '--headless=new', - '--disable-dev-shm-usage', - '--disable-software-rasterizer', - '--mute-audio', - '--remote-debugging-port=0', - '--window-size=1440,900', - ].filter(Boolean), - }, - }, - }; -} diff --git a/packages/ember/tests/acceptance/sentry-errors-test.ts b/packages/ember/tests/acceptance/sentry-errors-test.ts deleted file mode 100644 index 634175e1759d..000000000000 --- a/packages/ember/tests/acceptance/sentry-errors-test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { module, test } from 'qunit'; -import { setupApplicationTest } from 'ember-qunit'; -import { click, visit } from '@ember/test-helpers'; -import { next } from '@ember/runloop'; -import { setupSentryTest } from '../helpers/setup-sentry.ts'; -import { - assertSentryErrorCount, - assertSentryErrors, -} from '../helpers/utils.ts'; - -import type { SentryTestContext } from '../helpers/setup-sentry.ts'; - -module('Acceptance | Sentry Errors', function (hooks) { - setupApplicationTest(hooks); - setupSentryTest(hooks); - - test('Check "Throw Generic Javascript Error"', async function (this: SentryTestContext, assert) { - assert.expect(3); - - await visit('/'); - - await click('[data-test-button="Throw Generic Javascript Error"]'); - - assertSentryErrorCount(assert, 1); - assertSentryErrors(assert, 0, { - errorBodyContains: [...this.errorMessages], - }); - }); - - test('Check "Throw EmberError"', async function (this: SentryTestContext, assert) { - assert.expect(3); - - await visit('/'); - - await click('[data-test-button="Throw EmberError"]'); - - assertSentryErrorCount(assert, 1); - assertSentryErrors(assert, 0, { - errorBodyContains: [...this.errorMessages], - }); - }); - - test('Check "Caught Thrown EmberError"', async function (this: SentryTestContext, assert) { - assert.expect(1); - - await visit('/'); - - await click('[data-test-button="Caught Thrown EmberError"]'); - - assertSentryErrorCount(assert, 0); - }); - - test('Check "Error From Fetch"', async function (this: SentryTestContext, assert) { - assert.expect(3); - - this.fetchStub.onFirstCall().callsFake(() => { - throw new Error('Test error...'); - }); - - await visit('/'); - - await click('[data-test-button="Error From Fetch"]'); - - const done = assert.async(); - - // eslint-disable-next-line ember/no-runloop -- next() needed to wait for async error handler - next(() => { - assertSentryErrorCount(assert, 1); - assertSentryErrors(assert, 0, { errorBodyContains: ['Test error...'] }); - done(); - }); - }); - - test('Check "Error in AfterRender"', async function (this: SentryTestContext, assert) { - assert.expect(4); - - await visit('/'); - - await click('[data-test-button="Error in AfterRender"]'); - - assertSentryErrorCount(assert, 1); - assert.ok( - this.qunitOnUnhandledRejection.calledOnce, - 'Uncaught rejection should only be called once', - ); - assertSentryErrors(assert, 0, { - errorBodyContains: [...this.errorMessages], - }); - }); - - test('Check "Promise Rejection"', async function (this: SentryTestContext, assert) { - assert.expect(4); - - await visit('/'); - - await click('[data-test-button="Promise Rejection"]'); - - assertSentryErrorCount(assert, 1); - assert.ok( - this.qunitOnUnhandledRejection.calledOnce, - 'Uncaught rejection should only be called once', - ); - assertSentryErrors(assert, 0, { - errorBodyContains: [this.qunitOnUnhandledRejection.getCall(0).args[0]], - }); - }); - - test('Check "Error inside Promise"', async function (this: SentryTestContext, assert) { - assert.expect(4); - - await visit('/'); - - await click('[data-test-button="Error inside Promise"]'); - - assertSentryErrorCount(assert, 1); - assert.ok( - this.qunitOnUnhandledRejection.calledOnce, - 'Uncaught rejection should only be called once', - ); - assertSentryErrors(assert, 0, { - errorBodyContains: ['Error within Promise'], - }); - }); -}); diff --git a/packages/ember/tests/acceptance/sentry-performance-test.ts b/packages/ember/tests/acceptance/sentry-performance-test.ts deleted file mode 100644 index 7cd882e8522e..000000000000 --- a/packages/ember/tests/acceptance/sentry-performance-test.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { module, test } from 'qunit'; -import { setupApplicationTest } from 'ember-qunit'; -import { - click, - find, - resetOnerror, - settled, - setupOnerror, - visit, -} from '@ember/test-helpers'; -import { setupSentryTest } from '../helpers/setup-sentry.ts'; -import { - assertSentryTransactionCount, - assertSentryTransactions, -} from '../helpers/utils.ts'; - -const SLOW_TRANSITION_WAIT = 3000; - -module('Acceptance | Sentry Performance', function (hooks) { - setupApplicationTest(hooks); - setupSentryTest(hooks); - - test('Test transaction', async function (assert) { - await visit('/tracing'); - - assertSentryTransactionCount(assert, 1); - assertSentryTransactions(assert, 0, { - spans: ['ui.ember.transition | route:undefined -> route:tracing'], - transaction: 'route:tracing', - attributes: { - fromRoute: undefined, - toRoute: 'tracing', - }, - }); - }); - - test('Test navigating to slow route', async function (assert) { - await visit('/tracing'); - - await click('[data-test-button="Transition to slow loading route"]'); - - assertSentryTransactionCount(assert, 2); - assertSentryTransactions(assert, 1, { - spans: [ - 'ui.ember.transition | route:tracing -> route:slow-loading-route.index', - 'ui.ember.route.before_model | slow-loading-route', - 'ui.ember.route.model | slow-loading-route', - 'ui.ember.route.after_model | slow-loading-route', - 'ui.ember.route.before_model | slow-loading-route.index', - 'ui.ember.route.model | slow-loading-route.index', - 'ui.ember.route.after_model | slow-loading-route.index', - 'ui.ember.route.setup_controller | slow-loading-route', - 'ui.ember.route.setup_controller | slow-loading-route.index', - ], - transaction: 'route:slow-loading-route.index', - durationCheck: (duration) => duration > SLOW_TRANSITION_WAIT, - attributes: { - fromRoute: 'tracing', - toRoute: 'slow-loading-route.index', - }, - }); - }); - - test('Test page with loading state', async function (assert) { - await visit('/with-loading'); - - assertSentryTransactionCount(assert, 1); - assertSentryTransactions(assert, 0, { - spans: [ - 'ui.ember.transition | route:undefined -> route:with-loading.index', - 'ui.ember.route.before_model | with-loading.index', - 'ui.ember.route.model | with-loading.index', - 'ui.ember.route.after_model | with-loading.index', - 'ui.ember.route.setup_controller | with-loading.index', - ], - transaction: 'route:with-loading.index', - attributes: { - fromRoute: undefined, - toRoute: 'with-loading.index', - }, - }); - }); - - test('Test page with error state', async function (assert) { - // The route's model hook intentionally throws, so we need to handle errors - setupOnerror(() => { - // Swallow errors to let Ember transition to error substate - }); - - try { - await visit('/with-error'); - } catch { - // visit() may reject when the route model hook throws - } - - await settled(); - - resetOnerror(); - - // Ensure we are on error page - assert.ok(find('#test-page-load-error'), 'Error template is rendered'); - - assertSentryTransactionCount(assert, 1); - assertSentryTransactions(assert, 0, { - spans: [ - 'ui.ember.transition | route:undefined -> route:with-error.index', - 'ui.ember.route.before_model | with-error.index', - 'ui.ember.route.model | with-error.index', - ], - transaction: 'route:with-error.index', - attributes: { - fromRoute: undefined, - toRoute: 'with-error.index', - }, - }); - }); -}); diff --git a/packages/ember/tests/acceptance/sentry-replay-test.ts b/packages/ember/tests/acceptance/sentry-replay-test.ts deleted file mode 100644 index 638f06cb0fbd..000000000000 --- a/packages/ember/tests/acceptance/sentry-replay-test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { module, test } from 'qunit'; -import { setupApplicationTest } from 'ember-qunit'; -import { visit } from '@ember/test-helpers'; -import * as Sentry from '@sentry/ember'; -import { setupSentryTest } from '../helpers/setup-sentry.ts'; - -import type { BrowserClient, replayIntegration } from '@sentry/ember'; - -module('Acceptance | Sentry Session Replay', function (hooks) { - setupApplicationTest(hooks); - setupSentryTest(hooks); - - test('Test replay', async function (assert) { - await visit('/replay'); - - const integration = - Sentry.getClient()?.getIntegrationByName< - ReturnType - >('Replay'); - assert.ok(integration); - - const replay = integration!['_replay'] as ReturnType['_replay']; - - assert.true(replay.isEnabled()); - assert.false(replay.isPaused()); - }); -}); diff --git a/packages/ember/tests/helpers/setup-sentry.ts b/packages/ember/tests/helpers/setup-sentry.ts deleted file mode 100644 index 136870bc58b5..000000000000 --- a/packages/ember/tests/helpers/setup-sentry.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { getContext, resetOnerror, setupOnerror } from '@ember/test-helpers'; -import { setupPerformance, _resetGlobalInstrumentation } from '@sentry/ember'; -import sinon from 'sinon'; - -import type { TestContext } from '@ember/test-helpers'; - -import type ApplicationInstance from '@ember/application/instance'; - -export type SentryTestContext = TestContext & { - errorMessages: string[]; - fetchStub: sinon.SinonStub; - qunitOnUnhandledRejection: sinon.SinonStub; - _windowOnError: OnErrorEventHandler; -}; - -export function setupSentryTest(hooks: NestedHooks): void { - hooks.beforeEach(function (this: SentryTestContext) { - window._sentryTestEvents = []; - - // Set up performance instrumentation using the test app instance - const context = getContext() as { owner?: ApplicationInstance } | undefined; - if (context?.owner) { - setupPerformance(context.owner, { - minimumRunloopQueueDuration: 5, - minimumComponentRenderDuration: 0, - }); - } - const errorMessages: string[] = []; - this.errorMessages = errorMessages; - - /** - * Stub out fetch function to assert on Sentry calls. - */ - this.fetchStub = sinon.stub(window, 'fetch'); - - /** - * Stops global test suite failures from unhandled rejections and allows assertion on them. - * onUncaughtException is used in QUnit 2.17 onwards. - */ - this.qunitOnUnhandledRejection = sinon.stub( - QUnit, - // @ts-expect-error this is OK - QUnit.onUncaughtException - ? 'onUncaughtException' - : 'onUnhandledRejection', - ); - - // @ts-expect-error this is fine - QUnit.onError = function ({ message }: { message: string }) { - errorMessages.push(message.split('Error: ')[1]!); - return true; - }; - - setupOnerror(function (error: Error) { - errorMessages.push(error.message); - throw error; - }); - - this._windowOnError = window.onerror; - - /** - * Will collect errors when run via testem in cli - */ - window.onerror = (error) => { - errorMessages.push(error.toString().split('Error: ')[1]!); - }; - }); - - hooks.afterEach(function (this: SentryTestContext) { - _resetGlobalInstrumentation(); - this.fetchStub.restore(); - this.qunitOnUnhandledRejection.restore(); - window.onerror = this._windowOnError; - resetOnerror(); - }); -} - -declare global { - interface Window { - _sentryTestEvents: unknown[]; - } -} diff --git a/packages/ember/tests/helpers/utils.ts b/packages/ember/tests/helpers/utils.ts deleted file mode 100644 index 4d12de0536f3..000000000000 --- a/packages/ember/tests/helpers/utils.ts +++ /dev/null @@ -1,139 +0,0 @@ -import type { Event } from '@sentry/core'; - -const defaultAssertOptions = { - errorBodyContains: [], -}; - -function getTestSentryErrors(): Event[] { - return (window._sentryTestEvents as Event[]).filter( - (event) => event['type'] !== 'transaction', - ); -} - -function getTestSentryTransactions(): Event[] { - return (window._sentryTestEvents as Event[]).filter( - (event) => event['type'] === 'transaction', - ); -} - -export function assertSentryErrorCount(assert: Assert, count: number): void { - assert.equal( - getTestSentryErrors().length, - count, - 'Check correct number of Sentry events were sent', - ); -} - -export function assertSentryTransactionCount( - assert: Assert, - count: number, -): void { - assert.equal( - getTestSentryTransactions().length, - count, - 'Check correct number of Sentry events were sent', - ); -} - -export function assertSentryErrors( - assert: Assert, - callNumber: number, - options: { - errorBodyContains: string[]; - }, -): void { - const sentryTestEvents = getTestSentryErrors(); - const assertOptions = Object.assign({}, defaultAssertOptions, options); - - const event = sentryTestEvents[callNumber]; - - /** - * Body could be parsed here to check exact properties, but that requires too much implementation specific detail, - * instead this loosely matches on contents to check the correct error is being sent. - */ - assert.ok( - assertOptions.errorBodyContains.length, - 'Must pass strings to check against error body', - ); - const errorBody = JSON.stringify(event); - assertOptions.errorBodyContains.forEach((bodyContent) => { - assert.ok( - errorBody.includes(bodyContent), - `Checking that error body includes ${bodyContent}`, - ); - }); -} - -export function assertSentryTransactions( - assert: Assert, - callNumber: number, - options: { - spans: string[]; - transaction: string; - attributes: Record; - durationCheck?: (duration: number) => boolean; - }, -): void { - const sentryTestEvents = getTestSentryTransactions(); - const event = sentryTestEvents[callNumber]!; - - assert.ok(event, 'event exists'); - assert.ok(event.spans, 'event has spans'); - - const spans = event.spans || []; - - // instead of checking the specific order of runloop spans (which is brittle), - // we check (below) that _any_ runloop spans are added - // Also we ignore ui.long-task spans and ui.long-animation-frame, as they are brittle and may or may not appear - const filteredSpans = spans - .filter((span) => { - const op = span.op; - return ( - !op?.startsWith('ui.ember.runloop.') && - !op?.startsWith('ui.long-task') && - !op?.startsWith('ui.long-animation-frame') - ); - }) - .map((spanJson) => { - return `${spanJson.op} | ${spanJson.description}`; - }); - - // Runloop instrumentation may not fire in all test environments (e.g. strict app resolver) - // so we only check for runloop spans if they exist - const runloopSpans = spans.filter((span) => - span.op?.startsWith('ui.ember.runloop.'), - ); - if (runloopSpans.length > 0) { - assert.ok(runloopSpans.length > 0, 'it captures runloop spans'); - runloopSpans.forEach((span) => { - assert.ok( - span.op?.startsWith('ui.ember.runloop.'), - `runloop span has correct op: ${span.op}`, - ); - assert.ok( - span.description, - `runloop span has a description: ${span.description}`, - ); - }); - } else { - assert.true( - true, - 'runloop spans not captured (expected in strict resolver test environment)', - ); - } - assert.deepEqual(filteredSpans, options.spans, 'Has correct spans'); - - assert.equal(event.transaction, options.transaction); - - Object.keys(options.attributes).forEach((key) => { - assert.equal(event.contexts?.trace?.data?.[key], options.attributes[key]); - }); - - if (options.durationCheck && event.timestamp && event.start_timestamp) { - const duration = (event.timestamp - event.start_timestamp) * 1000; - assert.ok( - options.durationCheck(duration), - `duration (${duration}ms) passes duration check`, - ); - } -} diff --git a/packages/ember/tests/index.html b/packages/ember/tests/index.html deleted file mode 100644 index 0bf82bddc16e..000000000000 --- a/packages/ember/tests/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - sentry-ember Tests - - - - - -
-
-
-
-
-
- - - - - - - - diff --git a/packages/ember/tests/instrument-route-performance.test.ts b/packages/ember/tests/instrument-route-performance.test.ts new file mode 100644 index 000000000000..bbd2db964a13 --- /dev/null +++ b/packages/ember/tests/instrument-route-performance.test.ts @@ -0,0 +1,66 @@ +import type Route from '@ember/routing/route'; +import { startSpan } from '@sentry/browser'; +import { describe, expect, it, vi } from 'vitest'; + +vi.mock('@sentry/browser', () => ({ + startSpan: vi.fn((_options: unknown, callback: () => unknown) => callback()), +})); +vi.mock('@sentry/core', () => ({ + SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN: 'sentry.origin', + SEMANTIC_ATTRIBUTE_SENTRY_SOURCE: 'sentry.source', +})); + +describe('instrumentRoutePerformance', () => { + it('wrapped Route hooks maintain the current context', async () => { + const { instrumentRoutePerformance } = await import('../src/utils/instrumentRoutePerformance.ts'); + + const beforeModel = vi.fn(); + const model = vi.fn(); + const afterModel = vi.fn(); + const setupController = vi.fn(); + + class DummyRoute { + public fullRouteName = 'dummy'; + + public beforeModel(...args: unknown[]): void { + beforeModel.apply(this, args); + } + + public model(...args: unknown[]): void { + model.apply(this, args); + } + + public afterModel(...args: unknown[]): void { + afterModel.apply(this, args); + } + + public setupController(...args: unknown[]): void { + setupController.apply(this, args); + } + } + + const InstrumentedDummyRoute = instrumentRoutePerformance( + DummyRoute as unknown as new (...args: unknown[]) => Route, + ); + + const route = new InstrumentedDummyRoute(); + + await route.beforeModel('foo'); + expect(beforeModel).toHaveBeenCalledWith('foo'); + expect(beforeModel.mock.contexts[0]).toBe(route); + + await route.model('bar'); + expect(model).toHaveBeenCalledWith('bar'); + expect(model.mock.contexts[0]).toBe(route); + + await route.afterModel('bax'); + expect(afterModel).toHaveBeenCalledWith('bax'); + expect(afterModel.mock.contexts[0]).toBe(route); + + await route.setupController('baz'); + expect(setupController).toHaveBeenCalledWith('baz'); + expect(setupController.mock.contexts[0]).toBe(route); + + expect(startSpan).toHaveBeenCalledTimes(4); + }); +}); diff --git a/packages/ember/tests/instrument-router-location.test.ts b/packages/ember/tests/instrument-router-location.test.ts new file mode 100644 index 000000000000..8587ca8803b5 --- /dev/null +++ b/packages/ember/tests/instrument-router-location.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, it } from 'vitest'; +import { _getLocationURL } from '../src/utils/instrumentEmberAppInstanceForPerformance.ts'; + +interface Location { + formatURL?: (url: string) => string; + getURL?: () => string; + implementation?: string; + rootURL: string; +} + +describe('_getLocationURL', () => { + it('handles hash location without implementation field', () => { + const mockLocation: Location = { + getURL: () => '#/test-route', + formatURL: (url: string) => url, + rootURL: '/', + }; + + expect(_getLocationURL(mockLocation)).toBe('/#/test-route'); + }); + + it('handles hash location with implementation field', () => { + const mockLocation: Location = { + getURL: () => '#/test-route', + formatURL: (url: string) => url, + implementation: 'hash', + rootURL: '/', + }; + + expect(_getLocationURL(mockLocation)).toBe('/#/test-route'); + }); + + it('handles history location', () => { + const mockLocation: Location = { + getURL: () => '/test-route', + formatURL: (url: string) => url, + implementation: 'history', + rootURL: '/', + }; + + expect(_getLocationURL(mockLocation)).toBe('/test-route'); + }); + + it('handles none location type', () => { + const mockLocation: Location = { + getURL: () => '', + formatURL: (url: string) => url, + implementation: 'none', + rootURL: '/', + }; + + expect(_getLocationURL(mockLocation)).toBe(''); + }); + + it('handles custom rootURL for hash location', () => { + const mockLocation: Location = { + getURL: () => '#/test-route', + formatURL: (url: string) => url, + rootURL: '/my-app/', + }; + + expect(_getLocationURL(mockLocation)).toBe('/my-app/#/test-route'); + }); + + it('handles location without getURL method', () => { + const mockLocation: Location = { + formatURL: (url: string) => url, + rootURL: '/', + }; + + expect(_getLocationURL(mockLocation)).toBe(''); + }); + + it('handles location without formatURL method', () => { + const mockLocation: Location = { + getURL: () => '#/test-route', + rootURL: '/', + }; + + expect(_getLocationURL(mockLocation)).toBe(''); + }); +}); diff --git a/packages/ember/tests/test-helper.ts b/packages/ember/tests/test-helper.ts deleted file mode 100644 index 4b515a5bab80..000000000000 --- a/packages/ember/tests/test-helper.ts +++ /dev/null @@ -1,106 +0,0 @@ -import EmberApp from 'ember-strict-application-resolver'; -import EmberRouter from '@ember/routing/router'; -import * as QUnit from 'qunit'; -import { setApplication } from '@ember/test-helpers'; -import { setup } from 'qunit-dom'; -import { start as qunitStart, setupEmberOnerrorValidation } from 'ember-qunit'; -import PageTitleService from 'ember-page-title/services/page-title'; -import * as Sentry from '@sentry/ember'; -import { replayIntegration } from '@sentry/ember'; -import { setTesting } from '@embroider/macros'; - -// Initialize Sentry -Sentry.init({ - dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0', - tracesSampleRate: 1.0, - replaysSessionSampleRate: 1.0, - replaysOnErrorSampleRate: 1.0, - integrations: [replayIntegration()], - // Use a mock transport for testing - transport: () => ({ - send: (envelope: unknown) => { - // Extract event items from the envelope and store them - const items = - (envelope as [unknown, Array<[{ type: string }, unknown]>])[1] || []; - for (const [header, payload] of items) { - if (header.type === 'event' || header.type === 'transaction') { - window._sentryTestEvents = window._sentryTestEvents || []; - window._sentryTestEvents.push(payload); - } - } - return Promise.resolve({}); - }, - flush: () => Promise.resolve(true), - }), -}); - -class Router extends EmberRouter { - location = 'none'; - rootURL = '/'; -} - -// Transform glob imports to have correct module names for the resolver -// and extract the default export if present -function normalizeGlobModulesWithDefault( - glob: Record>, - basePath: string, -): Record { - const normalized: Record = {}; - for (const [path, mod] of Object.entries(glob)) { - // Transform ../demo-app/templates/index.gts -> ./templates/index - const normalizedPath = path - .replace(basePath + '/', './') - .replace(/\.gts$/, '') - .replace(/\.ts$/, ''); - // Use the default export if present, otherwise the whole module - normalized[normalizedPath] = mod.default ?? mod; - } - return normalized; -} - -const templates = import.meta.glob('../demo-app/templates/**/*', { - eager: true, -}) as Record>; -const routes = import.meta.glob('../demo-app/routes/**/*', { - eager: true, -}) as Record>; -const components = import.meta.glob('../demo-app/components/**/*', { - eager: true, -}) as Record>; - -class TestApp extends EmberApp { - modules = { - './router': Router, - './services/page-title': PageTitleService, - ...normalizeGlobModulesWithDefault(templates, '../demo-app'), - ...normalizeGlobModulesWithDefault(routes, '../demo-app'), - ...normalizeGlobModulesWithDefault(components, '../demo-app'), - }; -} - -Router.map(function () { - this.route('tracing'); - this.route('replay'); - this.route('slow-loading-route', function () { - this.route('index', { path: '/' }); - }); - this.route('with-loading', function () { - this.route('index', { path: '/' }); - }); - this.route('with-error', function () { - this.route('index', { path: '/' }); - }); -}); - -export function start() { - setTesting(true); - setApplication( - TestApp.create({ - autoboot: false, - rootElement: '#ember-testing', - }), - ); - setup(QUnit.assert); - setupEmberOnerrorValidation(); - qunitStart(); -} diff --git a/packages/ember/tests/unit/instrument-route-performance-test.ts b/packages/ember/tests/unit/instrument-route-performance-test.ts deleted file mode 100644 index da87a463945c..000000000000 --- a/packages/ember/tests/unit/instrument-route-performance-test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; -import { instrumentRoutePerformance } from '@sentry/ember'; -import Route from '@ember/routing/route'; -import sinon from 'sinon'; -import { setupSentryTest } from '../helpers/setup-sentry.ts'; - -import type { SentryTestContext } from '../helpers/setup-sentry.ts'; - -module('Unit | Utility | instrument-route-performance', function (hooks) { - setupTest(hooks); - setupSentryTest(hooks); - - test('wrapped Route hooks maintain the current context', function (this: SentryTestContext, assert) { - const beforeModel = sinon.spy(); - const model = sinon.spy(); - const afterModel = sinon.spy(); - const setupController = sinon.spy(); - - class DummyRoute extends Route { - public beforeModel(...args: unknown[]): ReturnType { - return beforeModel.call(this, ...args); - } - - public model(...args: unknown[]): unknown { - return model.call(this, ...args); - } - - public afterModel(...args: unknown[]): ReturnType { - return afterModel.call(this, ...args); - } - - public setupController(...args: unknown[]): unknown { - return setupController.call(this, ...args); - } - } - - const InstrumentedDummyRoute = instrumentRoutePerformance(DummyRoute); - - this.owner.register('route:dummy', InstrumentedDummyRoute); - - const route = this.owner.lookup('route:dummy') as DummyRoute; - - route.beforeModel('foo'); - - assert.ok( - beforeModel.calledOn(route), - 'The context for `beforeModel` is the route', - ); - assert.ok( - beforeModel.calledWith('foo'), - 'The arguments for `beforeModel` are passed through', - ); - - route.model('bar'); - - assert.ok(model.calledOn(route), 'The context for `model` is the route'); - assert.ok( - model.calledWith('bar'), - 'The arguments for `model` are passed through', - ); - - route.afterModel('bax'); - - assert.ok( - afterModel.calledOn(route), - 'The context for `afterModel` is the route', - ); - assert.ok( - afterModel.calledWith('bax'), - 'The arguments for `afterModel` are passed through', - ); - - route.setupController('baz'); - - assert.ok( - setupController.calledOn(route), - 'The context for `setupController` is the route', - ); - assert.ok( - setupController.calledWith('baz'), - 'The arguments for `setupController` are passed through', - ); - }); -}); diff --git a/packages/ember/tests/unit/instrument-router-location-test.ts b/packages/ember/tests/unit/instrument-router-location-test.ts deleted file mode 100644 index 75e5fa7790f6..000000000000 --- a/packages/ember/tests/unit/instrument-router-location-test.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { setupTest } from 'ember-qunit'; -import { module, test } from 'qunit'; -import { setupSentryTest } from '../helpers/setup-sentry.ts'; -import { getLocationURL } from '../../src/utils/ember/router.ts'; - -import type { SentryTestContext } from '../helpers/setup-sentry.ts'; - -interface Location { - formatURL?: (url: string) => string; - getURL?: () => string; - implementation?: string; - rootURL: string; -} - -module('Unit | Utility | instrument-router-location', function (hooks) { - setupTest(hooks); - setupSentryTest(hooks); - - test('getLocationURL handles hash location without implementation field', function (this: SentryTestContext, assert) { - // This simulates the default Ember HashLocation which doesn't include the implementation field - const mockLocation: Location = { - getURL: () => '#/test-route', - formatURL: (url: string) => url, - rootURL: '/', - }; - - const result = getLocationURL(mockLocation); - assert.strictEqual( - result, - '/#/test-route', - 'Should prepend rootURL to hash URL when implementation is not set', - ); - }); - - test('getLocationURL handles hash location with implementation field', function (this: SentryTestContext, assert) { - // This simulates a custom HashLocation with explicit implementation field - const mockLocation: Location = { - getURL: () => '#/test-route', - formatURL: (url: string) => url, - implementation: 'hash', - rootURL: '/', - }; - - const result = getLocationURL(mockLocation); - assert.strictEqual( - result, - '/#/test-route', - 'Should prepend rootURL to hash URL when implementation is hash', - ); - }); - - test('getLocationURL handles history location', function (this: SentryTestContext, assert) { - // This simulates a history location - const mockLocation: Location = { - getURL: () => '/test-route', - formatURL: (url: string) => url, - implementation: 'history', - rootURL: '/', - }; - - const result = getLocationURL(mockLocation); - assert.strictEqual( - result, - '/test-route', - 'Should return URL as-is for non-hash locations', - ); - }); - - test('getLocationURL handles none location type', function (this: SentryTestContext, assert) { - // This simulates a 'none' location (often used in tests) - const mockLocation: Location = { - getURL: () => '', - formatURL: (url: string) => url, - implementation: 'none', - rootURL: '/', - }; - - const result = getLocationURL(mockLocation); - assert.strictEqual( - result, - '', - 'Should return empty string when URL is empty', - ); - }); - - test('getLocationURL handles custom rootURL for hash location', function (this: SentryTestContext, assert) { - // Test with non-root rootURL - const mockLocation: Location = { - getURL: () => '#/test-route', - formatURL: (url: string) => url, - rootURL: '/my-app/', - }; - - const result = getLocationURL(mockLocation); - assert.strictEqual( - result, - '/my-app/#/test-route', - 'Should prepend custom rootURL to hash URL when implementation is not set', - ); - }); - - test('getLocationURL handles location without getURL method', function (this: SentryTestContext, assert) { - // This simulates an incomplete location object - const mockLocation: Location = { - formatURL: (url: string) => url, - rootURL: '/', - }; - - const result = getLocationURL(mockLocation); - assert.strictEqual( - result, - '', - 'Should return empty string when getURL is not available', - ); - }); - - test('getLocationURL handles location without formatURL method', function (this: SentryTestContext, assert) { - // This simulates an incomplete location object - const mockLocation: Location = { - getURL: () => '#/test-route', - rootURL: '/', - }; - - const result = getLocationURL(mockLocation); - assert.strictEqual( - result, - '', - 'Should return empty string when formatURL is not available', - ); - }); -}); diff --git a/packages/ember/tsconfig.json b/packages/ember/tsconfig.json index 4162dc6fb5b3..87e0120353ab 100644 --- a/packages/ember/tsconfig.json +++ b/packages/ember/tsconfig.json @@ -5,19 +5,9 @@ */ { "extends": "@ember/app-tsconfig", - "include": [ - "src/**/*", - "tests/**/*", - "unpublished-development-types/**/*", - "demo-app/**/*" - ], + "include": ["src/**/*", "tests/**/*", "unpublished-development-types/**/*"], "compilerOptions": { "rootDir": ".", - "types": [ - "ember-source/types", - "vite/client", - "@embroider/core/virtual", - "@glint/ember-tsc/types" - ] + "types": ["ember-source/types", "vite/client", "@embroider/core/virtual", "@glint/ember-tsc/types"] } } diff --git a/packages/ember/vite.config.mjs b/packages/ember/vite.config.mjs index b50ac32a679e..fb13286babd4 100644 --- a/packages/ember/vite.config.mjs +++ b/packages/ember/vite.config.mjs @@ -1,49 +1,14 @@ import { defineConfig } from 'vite'; -import { extensions, ember, classicEmberSupport } from '@embroider/vite'; +import { extensions, ember } from '@embroider/vite'; import { babel } from '@rollup/plugin-babel'; -import { resolve, dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - -// For scenario testing -const isCompat = Boolean(process.env.ENABLE_COMPAT_BUILD); export default defineConfig({ plugins: [ - ...(isCompat ? [classicEmberSupport()] : []), ember(), babel({ babelHelpers: 'inline', extensions, }), ], - resolve: { - // Monorepo workaround: in the sentry-javascript monorepo, @sentry/* packages - // resolve to workspace symlinks (raw TS sources). We alias them to either the - // built dist/ or npm-downloaded copies so Vite can bundle the test app. - // This section can be removed if the addon is ever extracted to its own repo. - alias: { - '@sentry/ember': resolve(__dirname, 'dist/index.js'), - '@sentry/browser': resolve(__dirname, '.npm-deps/browser'), - '@sentry/core': resolve(__dirname, '.npm-deps/core'), - '@sentry-internal/browser-utils': resolve( - __dirname, - '.npm-deps/browser-utils', - ), - '@sentry-internal/feedback': resolve(__dirname, '.npm-deps/feedback'), - '@sentry-internal/replay': resolve(__dirname, '.npm-deps/replay'), - '@sentry-internal/replay-canvas': resolve( - __dirname, - '.npm-deps/replay-canvas', - ), - }, - }, - build: { - rollupOptions: { - input: { - tests: 'tests/index.html', - }, - }, - }, + build: {}, }); diff --git a/yarn.lock b/yarn.lock index c9da68262465..37368e75cce7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3409,7 +3409,7 @@ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b" integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== -"@babel/runtime@^7.28.3", "@babel/runtime@^7.29.2": +"@babel/runtime@^7.28.3": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== @@ -3791,26 +3791,6 @@ resolved "https://registry.yarnpkg.com/@ember/library-tsconfig/-/library-tsconfig-2.0.0.tgz#c3f631a3c2316bdd0a8b5913d7c38862a452df22" integrity sha512-DTGt9TYZ3bhObUviQXx4C0v46oWM7HsRrUTbgONw2QBhJVHlmXA89uXenlvuqVrCQkA0g5kz7wwyOlcjIZ8h0w== -"@ember/test-helpers@^5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-5.4.2.tgz#828d38557a1c7a994ec5f8cb6318f743a768d837" - integrity sha512-ZT++x8DbixXgvxO00J064rzNcsn9WycMPisNvee6dg9u6G4Z1yx0Hc8HqUFBJP7NyxVKZCokHlRWRQuz9S6wvQ== - dependencies: - "@ember/test-waiters" "^3.1.0 || ^4.0.0" - "@embroider/addon-shim" "^1.10.2" - "@embroider/macros" "^1.20.2" - "@simple-dom/interface" "^1.4.0" - decorator-transforms "^2.0.0" - dom-element-descriptors "^0.5.0" - -"@ember/test-waiters@^3.1.0 || ^4.0.0", "@ember/test-waiters@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-4.1.1.tgz#f92747479845c52e3ec00fe0138c0ed19b0bbb2f" - integrity sha512-HbK70JYCDJcGI0CrwcbjeL2QHAn0HLwa3oGep7mr6l/yO95U7JYA8VN+/9VTsWJTmKueLtWayUqEmGS3a3mVOg== - dependencies: - "@embroider/addon-shim" "^1.9.0" - "@embroider/macros" "^1.16.9" - "@embroider/addon-dev@^8.3.0": version "8.3.0" resolved "https://registry.yarnpkg.com/@embroider/addon-dev/-/addon-dev-8.3.0.tgz#9a8c4ed0297478081164c5b66f3c731a9f15ee42" @@ -3827,7 +3807,7 @@ walk-sync "^3.0.0" yargs "^17.0.1" -"@embroider/addon-shim@^1.10.2", "@embroider/addon-shim@^1.9.0": +"@embroider/addon-shim@^1.10.2": version "1.10.2" resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.10.2.tgz#5164c65de0fd242422594c2f94b3c5eab4ab8e36" integrity sha512-EfI9cJ5/3QSUJtwm7x1MXrx3TEa2p7RNgSHefy7fvGm8/DP1xUFL25nST1NaHbHcqR1UhMlrTtv5iUIDoVzeQQ== @@ -3837,16 +3817,6 @@ common-ancestor-path "^1.0.1" semver "^7.3.8" -"@embroider/addon-shim@^1.8.7", "@embroider/addon-shim@^1.8.9": - version "1.8.9" - resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.8.9.tgz#ef37eba069d391b2d2a80aa62880c469051c4d43" - integrity sha512-qyN64T1jMHZ99ihlk7VFHCWHYZHLE1DOdHi0J7lmn5waV1DoW7gD8JLi1i7FregzXtKhbDc7shyEmTmWPTs8MQ== - dependencies: - "@embroider/shared-internals" "^2.6.0" - broccoli-funnel "^3.0.8" - common-ancestor-path "^1.0.1" - semver "^7.3.8" - "@embroider/compat@^4.1.17": version "4.1.18" resolved "https://registry.yarnpkg.com/@embroider/compat/-/compat-4.1.18.tgz#0ab61f461cbe62fc738efd509f4105122453eec5" @@ -3929,7 +3899,7 @@ typescript-memoize "^1.0.1" walk-sync "^3.0.0" -"@embroider/macros@1.20.2", "@embroider/macros@^1.16.12", "@embroider/macros@^1.16.9", "@embroider/macros@^1.20.2": +"@embroider/macros@1.20.2", "@embroider/macros@^1.20.2": version "1.20.2" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.20.2.tgz#e232ca61354f5001b29cda6030ebcd52e4b0023b" integrity sha512-WJWSkG9vIL0s93vKwtNFqqAOCOflNkWNpqsC7VAqXeeTKNpCc7wtdOhPkNGJpb52CEt7vlQ5R/zMyCfGAB7MEA== @@ -3970,24 +3940,6 @@ semver "^7.3.5" typescript-memoize "^1.0.1" -"@embroider/shared-internals@^2.6.0": - version "2.8.1" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-2.8.1.tgz#2aecff7324299f1e5fe563be7ee9882ee5566bcc" - integrity sha512-zi0CENFD1e0DH7c9M/rNKJnFnt2c3+736J3lguBddZdmaIV6Cb8l3HQSkskSW5O4ady+SavemLKO3hCjQQJBIw== - dependencies: - babel-import-util "^2.0.0" - debug "^4.3.2" - ember-rfc176-data "^0.3.17" - fs-extra "^9.1.0" - is-subdir "^1.2.0" - js-string-escape "^1.0.1" - lodash "^4.17.21" - minimatch "^3.0.4" - pkg-entry-points "^1.1.0" - resolve-package-path "^4.0.1" - semver "^7.3.5" - typescript-memoize "^1.0.1" - "@embroider/vite@^1.7.2": version "1.7.2" resolved "https://registry.yarnpkg.com/@embroider/vite/-/vite-1.7.2.tgz#7ff698b685bab03d5e13f12047fd9319c4063b94" @@ -4009,14 +3961,6 @@ source-map-url "^0.4.1" terser "^5.7.0" -"@emnapi/core@1.10.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" - integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== - dependencies: - "@emnapi/wasi-threads" "1.2.1" - tslib "^2.4.0" - "@emnapi/core@1.9.2", "@emnapi/core@^1.1.0", "@emnapi/core@^1.4.3": version "1.9.2" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.9.2.tgz#3870265ecffc7352d01ead62d8d83d8358a2d034" @@ -4025,13 +3969,6 @@ "@emnapi/wasi-threads" "1.2.1" tslib "^2.4.0" -"@emnapi/runtime@1.10.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" - integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== - dependencies: - tslib "^2.4.0" - "@emnapi/runtime@1.9.2", "@emnapi/runtime@^1.1.0", "@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.7.0": version "1.9.2" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.9.2.tgz#8b469a3db160817cadb1de9050211a9d1ea84fa2" @@ -5167,13 +5104,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz#04d90d5752b4ce65d2b6ac25eba08ff7624fe07c" integrity sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw== -"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.5.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" - integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== - dependencies: - eslint-visitor-keys "^3.4.3" - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.9.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" @@ -5181,34 +5111,11 @@ dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.5.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.5.0", "@eslint-community/regexpp@^4.6.1": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint/config-array@^0.21.2": - version "0.21.2" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" - integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== - dependencies: - "@eslint/object-schema" "^2.1.7" - debug "^4.3.1" - minimatch "^3.1.5" - -"@eslint/config-helpers@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" - integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== - dependencies: - "@eslint/core" "^0.17.0" - -"@eslint/core@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" - integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== - dependencies: - "@types/json-schema" "^7.0.15" - "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -5224,44 +5131,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^3.3.5": - version "3.3.5" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.5.tgz#c131793cfc1a7b96f24a83e0a8bbd4b881558c60" - integrity sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg== - dependencies: - ajv "^6.14.0" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.1" - minimatch "^3.1.5" - strip-json-comments "^3.1.1" - "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@eslint/js@9.39.4", "@eslint/js@^9.39.4": - version "9.39.4" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.4.tgz#a3f83bfc6fd9bf33a853dfacd0b49b398eb596c1" - integrity sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw== - -"@eslint/object-schema@^2.1.7": - version "2.1.7" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" - integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== - -"@eslint/plugin-kit@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" - integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== - dependencies: - "@eslint/core" "^0.17.0" - levn "^0.4.1" - "@fastify/busboy@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" @@ -5282,15 +5156,7 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@glimmer/component@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-2.1.1.tgz#aa80876d601a1639655ffd10a54229f8de07bdd9" - integrity sha512-zFZFaMbWy+9WOcDg/kCgrkGgqkLT39EE4FgyFD0MIkQO5coQsrRZyLsiBu1tbchyM+8hT8jAv+EQVUd8u+MdSQ== - dependencies: - "@embroider/addon-shim" "^1.10.2" - "@glimmer/env" "0.1.7" - -"@glimmer/env@0.1.7", "@glimmer/env@^0.1.7": +"@glimmer/env@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= @@ -5328,7 +5194,7 @@ dependencies: "@glimmer/interfaces" "0.94.6" -"@glint/ember-tsc@1.5.0", "@glint/ember-tsc@^1.5.0": +"@glint/ember-tsc@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@glint/ember-tsc/-/ember-tsc-1.5.0.tgz#ae4d2cea1b253e3af6f80171c76110bf7afed0ed" integrity sha512-mMAG91QyzKQvklnoQFy5orNA4gYU2LPQlPHUbJnuAHJ0c5pwyUO/rjseudFXAWRA5F8cQmNLqtximnLTvHSMzw== @@ -5350,22 +5216,11 @@ vscode-languageserver-textdocument "^1.0.12" vscode-uri "^3.1.0" -"@glint/template@1.7.7", "@glint/template@^1.7.7": +"@glint/template@1.7.7": version "1.7.7" resolved "https://registry.yarnpkg.com/@glint/template/-/template-1.7.7.tgz#d1ab3cf490c5308cc6d744eb625afa8b16558c48" integrity sha512-jcPdQ3A6cXo5h9RBi0tK4/o5qNn7868Y8xpkwWQNPAd8xQKuRKmG9dGJwUycXvtqISzfrnL1p3MQr3hYN/Ua6Q== -"@glint/tsserver-plugin@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@glint/tsserver-plugin/-/tsserver-plugin-2.4.0.tgz#4b450532ce021bb38edba5d4e0aa6c85399ce4f7" - integrity sha512-3HD8v9c2PvIR1dOCJfeilgIjLnSCiBeEgi6NEm14oa90bw0mu9LVB/YO8aCAGWw9A/CERnrV4HZdHqsr3rdySQ== - dependencies: - "@glint/ember-tsc" "1.5.0" - "@volar/language-core" "~2.4.28" - "@volar/typescript" "~2.4.28" - jiti "~2.6.1" - typescript "^5.9.3" - "@google-cloud/bigquery@^5.3.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@google-cloud/bigquery/-/bigquery-5.5.0.tgz#cfe72f8d056abd9c8289c724150d1082a0a6367d" @@ -5723,27 +5578,6 @@ resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.19.14.tgz#e30f844bc77e3ce7be442aac3b1f73ad8b58d181" integrity sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw== -"@humanfs/core@^0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" - integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== - dependencies: - "@humanfs/types" "^0.15.0" - -"@humanfs/node@^0.16.6": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" - integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== - dependencies: - "@humanfs/core" "^0.19.2" - "@humanfs/types" "^0.15.0" - "@humanwhocodes/retry" "^0.4.0" - -"@humanfs/types@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" - integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== - "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -5763,11 +5597,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - "@img/colour@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@img/colour/-/colour-1.0.0.tgz#d2fabb223455a793bf3bf9c70de3d28526aa8311" @@ -6162,19 +5991,6 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@lint-todo/utils@^13.1.1": - version "13.1.1" - resolved "https://registry.yarnpkg.com/@lint-todo/utils/-/utils-13.1.1.tgz#5c054d61ee037b9e552add118264771122cc1166" - integrity sha512-F5z53uvRIF4dYfFfJP3a2Cqg+4P1dgJchJsFnsZE0eZp0LK8X7g2J0CsJHRgns+skpXOlM7n5vFGwkWCWj8qJg== - dependencies: - "@types/eslint" "^8.4.9" - find-up "^5.0.0" - fs-extra "^9.1.0" - proper-lockfile "^4.1.2" - slash "^3.0.0" - tslib "^2.4.1" - upath "^2.0.1" - "@lukeed/csprng@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" @@ -6260,13 +6076,6 @@ dependencies: "@tybys/wasm-util" "^0.10.1" -"@napi-rs/wasm-runtime@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz#a46bbfedc29751b7170c5d23bc1d8ee8c7e3c1e1" - integrity sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow== - dependencies: - "@tybys/wasm-util" "^0.10.1" - "@nestjs/common@^10.0.0": version "10.4.15" resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-10.4.15.tgz#27c291466d9100eb86fdbe6f7bbb4d1a6ad55f70" @@ -6984,11 +6793,6 @@ dependencies: "@octokit/openapi-types" "^12.11.0" -"@one-ini/wasm@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.2.1.tgz#5e85cbb433460b23aaa18ac024cd1a556e9e5df9" - integrity sha512-TUqERXGNTifZ9y2g3wPxQrw3HpHv/02DsW3D90T9x0hhonrL1ZqpSmNrU2XkoIq0fP1N6gZfVQzy2Fw1ZvGBNg== - "@opentelemetry/api-logs@0.207.0": version "0.207.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz#ae991c51eedda55af037a3e6fc1ebdb12b289f49" @@ -7305,155 +7109,66 @@ dependencies: "@opentelemetry/core" "^2.0.0" -"@oxc-parser/binding-android-arm-eabi@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.130.0.tgz#55917e12ce2bf91f5d8f7af6fa337511b2ca6278" - integrity sha512-h/xYU8/7ADWzVSf5I+YalLpj33LOy9CI/zgbJNIZ5eunRBG+Czqa3lZsvuPHHf3rOt6z1c5+UzoxjbAzAvhwVw== - -"@oxc-parser/binding-android-arm64@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.130.0.tgz#6a88c34fa1641bff439b4def7e4a86070239ac83" - integrity sha512-oFWFJrsGv9siFM4HjMqKNB7IuIZD/SMmZdCXl8xyx7lDplGvPKyewpOo272rSWgMXe2Wx7bWI0Yj+gkHv4qbeg== - "@oxc-parser/binding-android-arm64@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.76.0.tgz#2bf8524add42f7a399ea0da9ae8e764bb9aeb61b" integrity sha512-1XJW/16CDmF5bHE7LAyPPmEEVnxSadDgdJz+xiLqBrmC4lfAeuAfRw3HlOygcPGr+AJsbD4Z5sFJMkwjbSZlQg== -"@oxc-parser/binding-darwin-arm64@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.130.0.tgz#d056a2b3a0100a5610e3014d75fe6d567fc49bd1" - integrity sha512-sGUzupdTplK9jQg7eJZ878HfEgQjJNBc6dAYVWJ9W5aU+J8rLfRJhTVsKThiu1pNwm6Y1qKCcbC6WhNWSXR3Ig== - "@oxc-parser/binding-darwin-arm64@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.76.0.tgz#e253b72b235dd6600449a5907e355f167a92a986" integrity sha512-yoQwSom8xsB+JdGsPUU0xxmxLKiF2kdlrK7I56WtGKZilixuBf/TmOwNYJYLRWkBoW5l2/pDZOhBm2luwmLiLw== -"@oxc-parser/binding-darwin-x64@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.130.0.tgz#21340dd67fcdfec7b0be9d4fc6490f84b80cc641" - integrity sha512-PsB4cdCISbC00Uy8eiD8bc2AkGWjZqrSrJnkBFuG2ptrrf6mZ2F5gLFSjOAVMMgZPg8B1D7OydJwLWSfyI2Plg== - "@oxc-parser/binding-darwin-x64@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.76.0.tgz#4490fd095ed0564f48938ca4f8cf3f00f7afeb1a" integrity sha512-uRIopPLvr3pf2Xj7f5LKyCuqzIU6zOS+zEIR8UDYhcgJyZHnvBkfrYnfcztyIcrGdQehrFUi3uplmI09E7RdiQ== -"@oxc-parser/binding-freebsd-x64@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.130.0.tgz#08db5e6dd718b4e7e7c98e5e2ca7bb538fd460a6" - integrity sha512-DgABp3l38hS77JbXCV4qk1+n6DPym5u8zzwuweokezm2tX194nDSJDENbDRECxVsiNbprKATLbk+Z5wlHT0OHw== - "@oxc-parser/binding-freebsd-x64@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.76.0.tgz#b1a448bfc52bec9523a7aa3958476ed8f391c367" integrity sha512-a0EOFvnOd2FqmDSvH6uWLROSlU6KV/JDKbsYDA/zRLyKcG6HCsmFnPsp8iV7/xr9WMbNgyJi6R5IMpePQlUq7Q== -"@oxc-parser/binding-linux-arm-gnueabihf@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.130.0.tgz#3ad94b6f0b763dec37ee0412905dad8e34c1a5a0" - integrity sha512-4Kn3CTEmwFrzhTSC/JuUW16qovmaMdX7jeSKbL8w0pLtLww7To1a2XJi9Z5uD8QWUkfUHhqfV+VD6dVzBnWzoA== - "@oxc-parser/binding-linux-arm-gnueabihf@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.76.0.tgz#4a8f1fc55582bc2a045dd79242d4fb18f1af2560" integrity sha512-ikRYDHL3fOdZwfJKmcdqjlLgkeNZ3Ez0qM8wAev5zlHZ+lY/Ig7qG5SCqPlvuTu+nNQ6zrFFaKvvt69EBKXU/g== -"@oxc-parser/binding-linux-arm-musleabihf@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.130.0.tgz#f2604ea11032989d779a22c47b8a636f91d2dd44" - integrity sha512-D35KZM3F4rRu1uAFKyBlg3Gaf/ybCjyaPR1hfgvk5ex8NtcTmRgc0JgSighEyNg96TPrFhemFba68SZuxaha8w== - "@oxc-parser/binding-linux-arm-musleabihf@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.76.0.tgz#bcd4f29ce158b1a817178c2e6962d1b51e9dc5ae" integrity sha512-dtRv5J5MRCLR7x39K8ufIIW4svIc7gYFUaI0YFXmmeOBhK/K2t/CkguPnDroKtsmXIPHDRtmJ1JJYzNcgJl6Wg== -"@oxc-parser/binding-linux-arm64-gnu@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.130.0.tgz#e3e3da7b98a5b8988893cba16cb81e0ee513ed1d" - integrity sha512-Q9o7oVlo955KHwS8l1u0bCzIx+JsZUA3XToLXC+MsMhye/9LeBQbt84nh120cl2XLy+TEzvugYDiHShg5yaX6Q== - "@oxc-parser/binding-linux-arm64-gnu@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.76.0.tgz#a398c29fc1d5a9cf16025a366fd2cca2a0cab097" integrity sha512-IE4iiiggFH2snagQxHrY5bv6dDpRMMat+vdlMN/ibonA65eOmRLp8VLTXnDiNrcla/itJ1L9qGABHNKU+SnE8g== -"@oxc-parser/binding-linux-arm64-musl@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.130.0.tgz#97ce15b046257465757e838ce173c09d540e840a" - integrity sha512-EiJ/gC0ljbcwVpycC8YWw6ggMbtsPX8XMOt0mPx0aqWeMsNR+L9m05Flbvd5T+GlivG+GkSWQL7tM9SRFpM/dw== - "@oxc-parser/binding-linux-arm64-musl@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.76.0.tgz#35c3236396a70dfb071f5a92764b23acca9f6357" integrity sha512-wi9zQPMDHrBuRuT7Iurfidc9qlZh7cKa5vfYzOWNBCaqJdgxmNOFzvYen02wVUxSWGKhpiPHxrPX0jdRyJ8Npg== -"@oxc-parser/binding-linux-ppc64-gnu@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.130.0.tgz#8c364ef28a2a4f694cc58c4fd951e1710a3703ed" - integrity sha512-b+h/lsLLurp756dMGizNs5uPaJfyEdWrTcV5t8M609jWm1DEHB1StpRXCkyvwtkJx3m+qL5BNQ0dEKan/4yGFA== - -"@oxc-parser/binding-linux-riscv64-gnu@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.130.0.tgz#1085fd4fe2664d6c138463f42a36286e9e70c3f5" - integrity sha512-O19Cil83XAyjEFfo8WhkMwY58ALqZ7ckjGL+25mjMIuF84urWBeANH0FC8B8BsSSygWU3/1aY3ADdDbp+wlBnw== - "@oxc-parser/binding-linux-riscv64-gnu@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.76.0.tgz#0e3e6567e78bcab5f29376d17512c428cdd7db64" integrity sha512-0tqqu1pqPee2lLGY8vtYlX1L415fFn89e0a3yp4q5N9f03j1rRs0R31qesTm3bt/UK8HYjECZ+56FCVPs2MEMQ== -"@oxc-parser/binding-linux-riscv64-musl@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.130.0.tgz#de0ea9c5a5dcb1dd2a0db73baab73e2f4e1005cd" - integrity sha512-BgXRVC0+83n3YzCscLQjj6nbyeBIVeZYPTI4fFMAE4WNm2+4RXhWp03IVizL7esIz36kgmT48aebk1iM+cs8sw== - -"@oxc-parser/binding-linux-s390x-gnu@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.130.0.tgz#6e0837ab6b7d1f2462cef3a86953de0288327ac2" - integrity sha512-6tJz0xvnGhsokE7N1WlUSBXibpYmT9xSJFS1Ce41Km/+8gQvdlW8MLhRv8PD0L7ix8vRG0FDDepp3jdOFzdVdw== - "@oxc-parser/binding-linux-s390x-gnu@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.76.0.tgz#a37496f6b9f2976c40daba44e3b521822323d210" integrity sha512-y36Hh1a5TA+oIGtlc8lT7N9vdHXBlhBetQJW0p457KbiVQ7jF7AZkaPWhESkjHWAsTVKD2OjCa9ZqfaqhSI0FQ== -"@oxc-parser/binding-linux-x64-gnu@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.130.0.tgz#738e29a90190a0d97e91cb9ed4a94c0f8121a0e3" - integrity sha512-9aCWj83dp3heTQGmGnZGdIWgxjZrr/7VQ0TGFHH5PKByxJKF2Hcr4qvaSUHhhGEa3MSsDjTL1YDP8RAgdL5/Cg== - "@oxc-parser/binding-linux-x64-gnu@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.76.0.tgz#ea13a10abe105f8ef29a36ae0285de7ed69488de" integrity sha512-7/acaG9htovp3gp/J0kHgbItQTuHctl+rbqPPqZ9DRBYTz8iV8kv3QN8t8Or8i/hOmOjfZp9McDoSU1duoR4/A== -"@oxc-parser/binding-linux-x64-musl@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.130.0.tgz#127c87488a0d23bc0990346c66ffa6e6f8f82fc8" - integrity sha512-afXt87aZBqrUVli8TB/I8H1G50RDWcwirjWtXGXYqJ2ZqWEiErH7V72j3LUSDZaivmtu2OLX0KQ/mbhP81mr7A== - "@oxc-parser/binding-linux-x64-musl@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.76.0.tgz#6733905918333044865cb4d1e42988741fc54dc0" integrity sha512-AxFt0reY6Q2rfudABmMTFGR8tFFr58NlH2rRBQgcj+F+iEwgJ+jMwAPhXd2y1I2zaI8GspuahedUYQinqxWqjA== -"@oxc-parser/binding-openharmony-arm64@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.130.0.tgz#9313e4d25badec37d9c349ecab9692af3c1bf556" - integrity sha512-I0NCrZV/YZuCGWgqwNN/GO/iXlLF2z+Wgc7u+Aa9N4P51oYeIa0XT+zVBUne4csO9GqxskXgI4g8JzzWGRpfOw== - -"@oxc-parser/binding-wasm32-wasi@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.130.0.tgz#9fb2d63b814bb7052774c50cd9b8c19047839a14" - integrity sha512-sJgQkGaBX0WJvPUDfwciex6IcTk5O5NLQ1bhEb6f3nBruh1GshKMRSMt2bxZlYrgBzjyBbJzsnO+InPG0bg+fA== - dependencies: - "@emnapi/core" "1.10.0" - "@emnapi/runtime" "1.10.0" - "@napi-rs/wasm-runtime" "^1.1.4" - "@oxc-parser/binding-wasm32-wasi@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.76.0.tgz#c47b50591e25b63d6d2ba7c34b5a71fa39c0a608" @@ -7461,26 +7176,11 @@ dependencies: "@napi-rs/wasm-runtime" "^0.2.11" -"@oxc-parser/binding-win32-arm64-msvc@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.130.0.tgz#939e48db2b47c93e7e3d4601c8eb6ff113ecc1db" - integrity sha512-bjcma99sQrNh6RY4mPO9yTkfxql6TDFoN3HWdK31RCKXwNhcDgJXW/l8PUtzKNiQ+9vpKJfJtQq+LklBuxSOBA== - "@oxc-parser/binding-win32-arm64-msvc@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.76.0.tgz#3bd03fe4bfe792e9de2e6c492036c85314593b05" integrity sha512-G7ZlEWcb2hNwCK3qalzqJoyB6HaTigQ/GEa7CU8sAJ/WwMdG/NnPqiC9IqpEAEy1ARSo4XMALfKbKNuqbSs5mg== -"@oxc-parser/binding-win32-ia32-msvc@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.130.0.tgz#ed50388593afc1b97f57d598edf4d51fe3e6d6fa" - integrity sha512-hRYbv6HhpSTzT4xTiIkadLI7upLQxuOdLPR/9nL1fTjwhgutBTPXrwaAPb/jTFVx6/8C7Jb5HcUKhmNwloTbFA== - -"@oxc-parser/binding-win32-x64-msvc@0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.130.0.tgz#e405110c0812d028c69775c35c6fb235f0fdff55" - integrity sha512-RBpA9TsRucJq6HNVNCFF1iKg+QeTkLdZf7hi4xaOGCPvMZWvDHjQgSOEZMUpuW4JNciHbxNhLEYmz5CVygjVGQ== - "@oxc-parser/binding-win32-x64-msvc@0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.76.0.tgz#3dbef82283f871c9cb59325c9daf4f740d11a6e9" @@ -7491,16 +7191,6 @@ resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.124.0.tgz#1dfd7b3fbb98febc2f91b505f48c940db73c8701" integrity sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg== -"@oxc-project/types@=0.129.0": - version "0.129.0" - resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.129.0.tgz#8e6362388ce6092feafd14f3a73ae6407b1285d9" - integrity sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg== - -"@oxc-project/types@^0.130.0": - version "0.130.0" - resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.130.0.tgz#a7825148711dc28805c46cfc21d94b63a4d41e88" - integrity sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q== - "@oxc-project/types@^0.76.0": version "0.76.0" resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.76.0.tgz#89ae800d774ccb344278fc17ab6c15348da8b995" @@ -8039,11 +7729,6 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@publint/pack@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@publint/pack/-/pack-0.1.4.tgz#866a82a1a8ab52329ae08baec6f3969ed99a30bf" - integrity sha512-HDVTWq3H0uTXiU0eeSQntcVUTPP3GamzeXI41+x7uU9J65JgWQh3qWZHblR1i0npXfFtF+mxBiU2nJH8znxWnQ== - "@react-router/dev@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@react-router/dev/-/dev-7.13.0.tgz#e66b09dc0a4c13a861e924f43ebb61078d79942f" @@ -8243,135 +7928,66 @@ dependencies: web-streams-polyfill "^3.1.1" -"@rolldown/binding-android-arm64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0.tgz#aefa7afdcabc1269b1933d50cad31013cb697143" - integrity sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA== - "@rolldown/binding-android-arm64@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz#ca20574c469ade7b941f90c9af5e83e7c67f06b7" integrity sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA== -"@rolldown/binding-darwin-arm64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0.tgz#83e708d97f9f8f3791e79ef8c24d5fcc5e8f29df" - integrity sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew== - "@rolldown/binding-darwin-arm64@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz#ce2c5c7fc4958dfc94783dc09b3d09f3c2e1d072" integrity sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg== -"@rolldown/binding-darwin-x64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0.tgz#4649bb4db634850f6de2b2f1ec37fc39a18adcf8" - integrity sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ== - "@rolldown/binding-darwin-x64@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz#251ecdf1fdb751031cb6486907c105daaf9dab21" integrity sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw== -"@rolldown/binding-freebsd-x64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0.tgz#2b0e50fdc926fa9680dca9d6acc4c3729b7df899" - integrity sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ== - "@rolldown/binding-freebsd-x64@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz#dbcfe95f409bf671a77bd83bff0fdc877d217728" integrity sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw== -"@rolldown/binding-linux-arm-gnueabihf@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0.tgz#8fd160371f4c160a2fa52de8f9ede51fbd43fc5b" - integrity sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A== - "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz#ea002b45445be6f9ed1883a834b335bc2ccd510f" integrity sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA== -"@rolldown/binding-linux-arm64-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0.tgz#9915488c96cb0fc49a70bd27c030def3cbbc8cbb" - integrity sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ== - "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz#12b96e7e7821a9dc2cd5c670ad56882987ed5c62" integrity sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w== -"@rolldown/binding-linux-arm64-musl@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0.tgz#74bb160f2747404eed2f917bea01b0548c783848" - integrity sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA== - "@rolldown/binding-linux-arm64-musl@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz#738b0f62f0b65bf676dfe48595017f1883859d1f" integrity sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ== -"@rolldown/binding-linux-ppc64-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0.tgz#fdc876160b6738ff34a7d719c4ea42edb38a70bc" - integrity sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg== - "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz#3088b9fbc2783033985b558316f87f39281bc533" integrity sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ== -"@rolldown/binding-linux-s390x-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0.tgz#39668ce16e8c2ac16308fdb7116ebd5b44acab65" - integrity sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA== - "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz#ac0aa6f1b72e3151d56c43145a71c745cf862a9a" integrity sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ== -"@rolldown/binding-linux-x64-gnu@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0.tgz#02a7e4a0fa3af90bf4e937ecd1f4c0dc07ab2397" - integrity sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA== - "@rolldown/binding-linux-x64-gnu@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz#b8cf27aa5be6da641c22dad5665d0240551d2dec" integrity sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA== -"@rolldown/binding-linux-x64-musl@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0.tgz#610a08a3055d21f287c550e16a5541501883f2b1" - integrity sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw== - "@rolldown/binding-linux-x64-musl@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz#4531f9eca77963935026634ba9b61c2535340534" integrity sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw== -"@rolldown/binding-openharmony-arm64@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0.tgz#62e5da4d623b446a57c9f472b598fedaf5289a3d" - integrity sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig== - "@rolldown/binding-openharmony-arm64@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz#66ff691a65f9325171bced98e353b4cc4b0095c3" integrity sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg== -"@rolldown/binding-wasm32-wasi@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0.tgz#57191a2986e7f43a920fc618da92f29b0b8123c9" - integrity sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg== - dependencies: - "@emnapi/core" "1.10.0" - "@emnapi/runtime" "1.10.0" - "@napi-rs/wasm-runtime" "^1.1.4" - "@rolldown/binding-wasm32-wasi@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz#7db6c90aa510eef65d7d0f14e8ca23775e8e5eee" @@ -8381,31 +7997,16 @@ "@emnapi/runtime" "1.9.2" "@napi-rs/wasm-runtime" "^1.1.3" -"@rolldown/binding-win32-arm64-msvc@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0.tgz#77faf1e28521411bd0be6f4e55f3c4c5f17cd619" - integrity sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow== - "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz#81f9097abbd4493cc13373b26f5a3da8461dbb47" integrity sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA== -"@rolldown/binding-win32-x64-msvc@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0.tgz#980a8f9983b0bd3d35ee867ade85cb020eca27ba" - integrity sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg== - "@rolldown/binding-win32-x64-msvc@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz#cef11bc89149f3a77771727be75490fbb13ae193" integrity sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g== -"@rolldown/pluginutils@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0.tgz#d660b953fd500d552fc17213f279e29037f08c2d" - integrity sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ== - "@rolldown/pluginutils@1.0.0-rc.15": version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz#e75d7731593e195d23710f9ff49bf5c745c96682" @@ -8735,25 +8336,6 @@ "@angular-devkit/schematics" "14.2.13" jsonc-parser "3.1.0" -"@sec-ant/readable-stream@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" - integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== - -"@sentry-internal/browser-utils@10.52.0": - version "10.52.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-10.52.0.tgz#e533b829dfe5959982369f01dc2b8423fcea481d" - integrity sha512-x/yEPZdpH6NGQeoeQnV9tj8reAH8twNttiltGZl2o8Rk7sQeUfe7E8yuYP2XbJ2RqyZK5qRS3COrNyMPzf6KFA== - dependencies: - "@sentry/core" "10.52.0" - -"@sentry-internal/feedback@10.52.0": - version "10.52.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-10.52.0.tgz#4c08cf86dd2a82bfc57c070a9d5636d4d7af8658" - integrity sha512-5kAn1W8ZvCuHtEHXpq6iRkUMdNCilwww+YxaN2yofVrCivAbB3Ha5JJUMqmWOPW0pC27zGYmoJMIDvG+PczUxA== - dependencies: - "@sentry/core" "10.52.0" - "@sentry-internal/node-cpu-profiler@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@sentry-internal/node-cpu-profiler/-/node-cpu-profiler-2.4.0.tgz#3f14cb7c3637b48e87056c2a5787c5e0aa90b987" @@ -8770,22 +8352,6 @@ detect-libc "^2.0.4" node-abi "^3.89.0" -"@sentry-internal/replay-canvas@10.52.0": - version "10.52.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-10.52.0.tgz#0506c91ec1d5903196aa26bd28ee06108fe17bca" - integrity sha512-BI5ie4dxPuUJ344CXVSnAxY1xZCbghglPSCIlTOYODpR9so9yo5IZh+Mwspt0oWsUMaxWJiQSNYlbPWi7WDavg== - dependencies: - "@sentry-internal/replay" "10.52.0" - "@sentry/core" "10.52.0" - -"@sentry-internal/replay@10.52.0": - version "10.52.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-10.52.0.tgz#332b3a9e4116c42188477229af2824c7c73c4271" - integrity sha512-diywyuc/H7VTUR+W5ryVmLF+0X4UP1OskMqb6V8RSAvJHcj2JmIm7uP+Fc6ACTno+b6AUShwT/L4xVXzO6X9Cw== - dependencies: - "@sentry-internal/browser-utils" "10.52.0" - "@sentry/core" "10.52.0" - "@sentry-internal/rrdom@2.42.0": version "2.42.0" resolved "https://registry.yarnpkg.com/@sentry-internal/rrdom/-/rrdom-2.42.0.tgz#fc26d88d01edce7580b66f255b8ad65816829aaa" @@ -8825,17 +8391,6 @@ resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-5.3.0.tgz#356218f747969f9af970987dcf0f17ec81d6e50c" integrity sha512-p4q8gn8wcFqZGP/s2MnJCAAd8fTikaU6A0mM97RDHQgStcrYiaS0Sc5zUNfb1V+UOLPuvdEdL6MwyxfzjYJQTA== -"@sentry/browser@10.52.0": - version "10.52.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-10.52.0.tgz#5ed5e29e1dffc509c6cf95495c96674a9ea1b25c" - integrity sha512-ijL9jN86oXwXQWbwhPlEb70ODJSEmjxQEQdnZkC4gDWbjswcwvRsVJPYk+1xl2ir2iZixRIHipVxDcLwian35g== - dependencies: - "@sentry-internal/browser-utils" "10.52.0" - "@sentry-internal/feedback" "10.52.0" - "@sentry-internal/replay" "10.52.0" - "@sentry-internal/replay-canvas" "10.52.0" - "@sentry/core" "10.52.0" - "@sentry/bundler-plugin-core@5.3.0", "@sentry/bundler-plugin-core@^5.3.0": version "5.3.0" resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-5.3.0.tgz#2772866dcb076c36721d2acab1010a6fc0b3ff2f" @@ -8909,11 +8464,6 @@ "@sentry/cli-win32-i686" "2.58.5" "@sentry/cli-win32-x64" "2.58.5" -"@sentry/core@10.52.0": - version "10.52.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-10.52.0.tgz#13842ef35db9909d64770d84656704cb929de445" - integrity sha512-VA/kAqLhkMnRWY2RXdBLyTemR9D4m7MVRy/gyapoq9yvllVPx9WXbvKgnMP2LQp7mFgT/oLFvw58aQKaYTGn3A== - "@sentry/rollup-plugin@5.3.0", "@sentry/rollup-plugin@^5.3.0": version "5.3.0" resolved "https://registry.yarnpkg.com/@sentry/rollup-plugin/-/rollup-plugin-5.3.0.tgz#1dbfbee8d5d2a0f6acc245f4dd05e46c66291710" @@ -8993,13 +8543,6 @@ resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== -"@simple-dom/document@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" - integrity sha512-/RUeVH4kuD3rzo5/91+h4Z1meLSLP66eXqpVAw/4aZmYozkeqUkMprq0znL4psX/adEed5cBgiNJcfMz/eKZLg== - dependencies: - "@simple-dom/interface" "^1.4.0" - "@simple-dom/interface@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" @@ -9037,28 +8580,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339" integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ== -"@sinonjs/commons@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^15.4.0": - version "15.4.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz#5d40c151a9e66075fe4520bec40bccfe54931962" - integrity sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA== - dependencies: - "@sinonjs/commons" "^3.0.1" - -"@sinonjs/samsam@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-10.0.2.tgz#d2cb34f0bcddb955b6971585c2f0334e68a9e66d" - integrity sha512-8lVwD1Df1BmzoaOLhMcGGcz/Jyr5QY2KSB75/YK1QgKzoabTeLdIVyhXNZK9ojfSKSdirbXqdbsXXqP9/Ve8+A== - dependencies: - "@sinonjs/commons" "^3.0.1" - type-detect "^4.1.0" - "@size-limit/esbuild@~12.1.0": version "12.1.0" resolved "https://registry.yarnpkg.com/@size-limit/esbuild/-/esbuild-12.1.0.tgz#d0527ee8eed98794966b089c7fe61760cf4e6c7b" @@ -9580,11 +9101,6 @@ color "^5.0.2" text-hex "1.0.x" -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - "@solid-devtools/debugger@^0.28.1": version "0.28.1" resolved "https://registry.yarnpkg.com/@solid-devtools/debugger/-/debugger-0.28.1.tgz#5c2e9d533ef65ac9debb4b1c3a625c6494f811c6" @@ -10313,21 +9829,11 @@ dependencies: "@types/node" "*" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - "@types/cookie@^0.6.0": version "0.6.0" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== -"@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - "@types/css-font-loading-module@0.0.7": version "0.0.7" resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz#2f98ede46acc0975de85c0b7b0ebe06041d24601" @@ -10366,19 +9872,6 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/eslint@^8.4.9": - version "8.56.12" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a" - integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/esrecurse@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" - integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== - "@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.1", "@types/estree@^1.0.6", "@types/estree@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" @@ -10617,7 +10110,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0", "@types/node@>=18": +"@types/node@*", "@types/node@>=13.7.0", "@types/node@>=18": version "25.3.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-25.3.3.tgz#605862544ee7ffd7a936bcbf0135a14012f1e549" integrity sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ== @@ -10677,11 +10170,6 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== -"@types/qunit@^2.19.13": - version "2.19.14" - resolved "https://registry.yarnpkg.com/@types/qunit/-/qunit-2.19.14.tgz#d73ab00eb202b48757cd7d15b65e1de6d142c930" - integrity sha512-ou2RMtwyDnW1btrMnDMZeL6V5/yRRbuHKrRC6y8IuzDljjVzw6wPCVFb8p4qJD0NkUkf3BdZeJJIBzjK1BUUDQ== - "@types/range-parser@*": version "1.2.3" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" @@ -10791,18 +10279,6 @@ "@types/mime" "*" "@types/node" "*" -"@types/sinon@^21.0.1": - version "21.0.1" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-21.0.1.tgz#f995e2afdf15be832d5f1645803d82a8eb95a1bc" - integrity sha512-5yoJSqLbjH8T9V2bksgRayuhpZy+723/z6wBOR+Soe4ZlXC0eW8Na71TeaZPUWDQvM7LYKa9UGFc6LRqxiR5fQ== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== - "@types/sockjs@^0.3.33": version "0.3.36" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" @@ -10886,20 +10362,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz#5d6da7e7b236b46452fa00d3904bb6f59615bfde" - integrity sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw== - dependencies: - "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.59.3" - "@typescript-eslint/type-utils" "8.59.3" - "@typescript-eslint/utils" "8.59.3" - "@typescript-eslint/visitor-keys" "8.59.3" - ignore "^7.0.5" - natural-compare "^1.4.0" - ts-api-utils "^2.5.0" - "@typescript-eslint/eslint-plugin@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -10916,17 +10378,6 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.59.3.tgz#f46cbc70ae0a25119ef94eac9ecd46714788e1a1" - integrity sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg== - dependencies: - "@typescript-eslint/scope-manager" "8.59.3" - "@typescript-eslint/types" "8.59.3" - "@typescript-eslint/typescript-estree" "8.59.3" - "@typescript-eslint/visitor-keys" "8.59.3" - debug "^4.4.3" - "@typescript-eslint/parser@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" @@ -10946,15 +10397,6 @@ "@typescript-eslint/types" "^8.35.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.59.3.tgz#1be5ae152aad987a156c9a1a9b4256e75cfbbe0c" - integrity sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.59.3" - "@typescript-eslint/types" "^8.59.3" - debug "^4.4.3" - "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -10971,24 +10413,11 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/scope-manager@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz#91a60f66803fe9dae0696fbab2451f5723f119d2" - integrity sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA== - dependencies: - "@typescript-eslint/types" "8.59.3" - "@typescript-eslint/visitor-keys" "8.59.3" - "@typescript-eslint/tsconfig-utils@8.35.0", "@typescript-eslint/tsconfig-utils@^8.35.0": version "8.35.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz#6e05aeb999999e31d562ceb4fe144f3cbfbd670e" integrity sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA== -"@typescript-eslint/tsconfig-utils@8.59.3", "@typescript-eslint/tsconfig-utils@^8.57.1", "@typescript-eslint/tsconfig-utils@^8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz#88ca9036b42ccdd1e630cfdafd2e042c2ca6a835" - integrity sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw== - "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -10999,17 +10428,6 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz#421fb2448bdfeb301d134a01cd02503f67fd8192" - integrity sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ== - dependencies: - "@typescript-eslint/types" "8.59.3" - "@typescript-eslint/typescript-estree" "8.59.3" - "@typescript-eslint/utils" "8.59.3" - debug "^4.4.3" - ts-api-utils "^2.5.0" - "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" @@ -11025,11 +10443,6 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.35.0.tgz#e60d062907930e30008d796de5c4170f02618a93" integrity sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ== -"@typescript-eslint/types@8.59.3", "@typescript-eslint/types@^8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.3.tgz#b7ca539c5e302fdde9a7cadb73caed107ef8f2cd" - integrity sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg== - "@typescript-eslint/types@^8.11.0", "@typescript-eslint/types@^8.35.0": version "8.47.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.47.0.tgz#c7fc9b6642d03505f447a8392934b9d1850de5af" @@ -11062,21 +10475,6 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/typescript-estree@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz#e6bb1408e00b47e431427a40268db4e86cb121ab" - integrity sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg== - dependencies: - "@typescript-eslint/project-service" "8.59.3" - "@typescript-eslint/tsconfig-utils" "8.59.3" - "@typescript-eslint/types" "8.59.3" - "@typescript-eslint/visitor-keys" "8.59.3" - debug "^4.4.3" - minimatch "^10.2.2" - semver "^7.7.3" - tinyglobby "^0.2.15" - ts-api-utils "^2.5.0" - "@typescript-eslint/typescript-estree@^8.23.0": version "8.35.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz#86141e6c55b75bc1eaecc0781bd39704de14e52a" @@ -11107,16 +10505,6 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.59.3.tgz#f693f979deb4dc3994de03ff8b23976d625c36c5" - integrity sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.59.3" - "@typescript-eslint/types" "8.59.3" - "@typescript-eslint/typescript-estree" "8.59.3" - "@typescript-eslint/utils@^7.0.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" @@ -11151,14 +10539,6 @@ "@typescript-eslint/types" "8.35.0" eslint-visitor-keys "^4.2.1" -"@typescript-eslint/visitor-keys@8.59.3": - version "8.59.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz#820843b1b5ca4290009cf189382abcf6fe00dfa6" - integrity sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg== - dependencies: - "@typescript-eslint/types" "8.59.3" - eslint-visitor-keys "^5.0.0" - "@typespec/ts-http-runtime@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz#1048df6182b02bec8962a9cffd1c5ee1a129541f" @@ -11920,11 +11300,6 @@ dependencies: tslib "^2.6.3" -"@xmldom/xmldom@^0.9.9": - version "0.9.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.9.10.tgz#a0ad5a26fe8aa996310870726e1704977f769dee" - integrity sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw== - "@xstate/fsm@^1.4.0": version "1.6.5" resolved "https://registry.yarnpkg.com/@xstate/fsm/-/fsm-1.6.5.tgz#f599e301997ad7e3c572a0b1ff0696898081bea5" @@ -12148,16 +11523,6 @@ ajv@^6.11.0, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.14.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" - integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^8.0.0, ajv@^8.10.0, ajv@^8.9.0: version "8.18.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" @@ -12393,11 +11758,6 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -aria-query@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" @@ -12767,11 +12127,6 @@ axobject-query@^3.2.1: dependencies: dequal "^2.0.3" -axobject-query@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" - integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== - b4a@^1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" @@ -12787,11 +12142,6 @@ babel-dead-code-elimination@^1.0.10, babel-dead-code-elimination@^1.0.6, babel-d "@babel/traverse" "^7.23.7" "@babel/types" "^7.23.6" -babel-import-util@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-2.0.0.tgz#99a2e7424bcde01898bc61bb19700ff4c74379a3" - integrity sha512-pkWynbLwru0RZmA9iKeQL63+CkkW0RCP3kL5njCtudd6YPUKb5Pa0kL4fb3bmuKn2QDBFwY5mvvhEK/+jv2Ynw== - babel-import-util@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-2.1.1.tgz#0f4905fe899abfb8cd835dd52f3df1966d1ffbb0" @@ -12870,15 +12220,6 @@ babel-plugin-ember-template-compilation@^3.1.0: babel-import-util "^3.0.0" import-meta-resolve "^4.1.0" -babel-plugin-ember-template-compilation@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-template-compilation/-/babel-plugin-ember-template-compilation-4.0.0.tgz#d35045b15b7cd4cae64204979a19f649adb50317" - integrity sha512-J2dR6ZPfPNuIR7vzhneO9xR0aTvOHITszuGif2EOYw3Qg3KlIVEd/hNnEeubyWgjYXn06Sgm6/NdNXEMNSsWYQ== - dependencies: - "@glimmer/syntax" ">= 0.94.9" - babel-import-util "^3.0.0" - import-meta-resolve "^4.1.0" - babel-plugin-istanbul@6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -13009,13 +12350,6 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -backbone@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.6.1.tgz#6e067777767f54b9e150d3de825f7d66e7ed77d0" - integrity sha512-YQzWxOrIgL6BoFnZjThVN99smKYhyEXXFyJJ2lsF1wJLyo4t+QjmkLrH8/fN22FZ4ykF70Xq7PgTugJVR4zS9Q== - dependencies: - underscore ">=1.8.3" - backburner.js@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/backburner.js/-/backburner.js-2.8.0.tgz#72f8c7455ff664ff8e79a32415977e10a18e03c7" @@ -13079,11 +12413,6 @@ base64-js@^1.2.0, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - baseline-browser-mapping@^2.10.12: version "2.10.29" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz#47bdc13027af28d341f367a4f35a07ce872e27b4" @@ -13879,14 +13208,6 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -13895,6 +13216,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^5.0.0, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -13925,13 +13254,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -charm@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" - integrity sha512-wqW3VdPnlSWT4eRiYX+hcs+C6ViBPUWk1qTCd+37qw9kEm/a5n2qcyQDMBWvSYKN/ctqZzeXNQaeBjOetJJUkw== - dependencies: - inherits "^2.0.1" - check-error@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" @@ -14249,11 +13571,6 @@ commander@12.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== -commander@7.2.0, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^10.0.0, commander@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -14269,7 +13586,7 @@ commander@^12.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== -commander@^14.0.2, commander@^14.0.3: +commander@^14.0.2: version "14.0.3" resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz#425d79b48f9af82fcd9e4fc1ea8af6c5ec07bbc2" integrity sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== @@ -14284,6 +13601,11 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -14337,7 +13659,7 @@ compressible@~2.0.18: dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4, compression@^1.8.1: +compression@^1.7.4: version "1.8.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== @@ -14365,18 +13687,6 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concurrently@^9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.2.1.tgz#248ea21b95754947be2dad9c3e4b60f18ca4e44f" - integrity sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng== - dependencies: - chalk "4.1.2" - rxjs "7.8.2" - shell-quote "1.8.3" - supports-color "8.1.1" - tree-kill "1.2.2" - yargs "17.7.2" - confbox@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" @@ -14435,11 +13745,6 @@ console-ui@^3.1.2: ora "^3.4.0" through2 "^3.0.1" -consolidate@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-1.0.4.tgz#9052e88bf3cf89a444df3cb61f1d4c6b9c8afcf0" - integrity sha512-RuZ3xnqEDsxiwaoIkqVeeK3gg9qxw7+YKYX2tKhLs1eukVKMgSr4VYI3iYFsRHi4TloHYDlugrz3kvkjs3nynA== - content-disposition@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.1.tgz#a8b7bbeb2904befdfb6787e5c0c086959f605f9b" @@ -14452,12 +13757,7 @@ content-disposition@~0.5.4: dependencies: safe-buffer "5.2.1" -content-tag@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/content-tag/-/content-tag-3.1.3.tgz#4ef462f459a81ba73945dd661a8041bf8062cc03" - integrity sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g== - -content-tag@^4.1.0, content-tag@^4.1.1, content-tag@^4.2.0: +content-tag@^4.1.0, content-tag@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/content-tag/-/content-tag-4.2.0.tgz#b241f94a37a117fda7e0471dbcbfb664454e38cd" integrity sha512-f/o+F3qSa4gg23I7RWy6cMDxP2nPo99YWusxw2bjne7ZC6Acqqf4uB/+87AekOq1ehTocHH7b7nMd2X4S3NHVw== @@ -14509,7 +13809,7 @@ cookie@^0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -cookie@^0.7.1, cookie@^0.7.2, cookie@~0.7.1, cookie@~0.7.2: +cookie@^0.7.1, cookie@^0.7.2, cookie@~0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -14576,7 +13876,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@2.8.6, cors@^2.8.5, cors@~2.8.5: +cors@2.8.6, cors@^2.8.5: version "2.8.6" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== @@ -14945,7 +14245,7 @@ debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.6.8: dependencies: ms "2.0.0" -debug@4, debug@4.x, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3, debug@~4.4.1: +debug@4, debug@4.x, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -14966,13 +14266,6 @@ debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@~4.3.1, debug@~4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - decamelize@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -15007,15 +14300,7 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -decorator-transforms@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/decorator-transforms/-/decorator-transforms-2.2.2.tgz#c163e86815c78152528a8c1549e95d8f3403e61b" - integrity sha512-NHCSJXOUQ29YFli1QzstXWo72EyASpoVx+s0YdkMwswpovf/iAJP580nD1tB0Ph9exvtbfWdVrSAloXrWVo1Xg== - dependencies: - "@babel/plugin-syntax-decorators" "^7.23.3" - babel-import-util "^3.0.0" - -decorator-transforms@^2.2.2, decorator-transforms@^2.3.2: +decorator-transforms@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/decorator-transforms/-/decorator-transforms-2.3.2.tgz#265a3dd318f875d10a9aae88415a6dd7806a3dd4" integrity sha512-XcErcjlmCzG5ODgYjt6ZTXwd6S8fPKln/sJmw15ZXkWG2JpoQNwszis+AwF6XSGlOoG7g8MCEO97g+Yw3fk5OQ== @@ -15355,11 +14640,6 @@ diff@^8.0.2: resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.3.tgz#c7da3d9e0e8c283bb548681f8d7174653720c2d5" integrity sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ== -diff@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-9.0.0.tgz#297c31cd7c280f13dfe335791ec2063bd4a73a6f" - integrity sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -15410,11 +14690,6 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" -dom-element-descriptors@^0.5.0, dom-element-descriptors@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/dom-element-descriptors/-/dom-element-descriptors-0.5.1.tgz#3ebfcf64198f922dba928f84f7970bb571891317" - integrity sha512-DLayMRQ+yJaziF4JJX1FMjwjdr7wdTr1y9XvZ+NfHELfOMcYDnCHneAYXAS4FT1gLILh4V0juMZohhH1N5FsoQ== - dom-mutator@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/dom-mutator/-/dom-mutator-0.6.0.tgz#079d7a4b3e8981a562cd777548b99baab51d65c5" @@ -15582,16 +14857,6 @@ editions@^2.2.0: errlop "^2.0.0" semver "^6.3.0" -editorconfig@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-3.0.2.tgz#078dff888b3db3286f3bd9cff989e672267a2291" - integrity sha512-T0ix8GhtxyKVfUFEcvdNDt3YGqlwkFHbD4/5bgFUDgFmxhI/cSRAeJ87/Sz//Cq8Eam6JX/e23RkoFO71P7aAA== - dependencies: - "@one-ini/wasm" "0.2.1" - commander "^14.0.3" - minimatch "~10.2.4" - semver "^7.7.4" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -15761,57 +15026,11 @@ ember-cli-version-checker@^5.1.2: semver "^7.3.4" silent-error "^1.1.1" -ember-eslint-parser@^0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/ember-eslint-parser/-/ember-eslint-parser-0.11.3.tgz#fbc35431c4edbadcaaaa016bb8d77b4a9ea9900d" - integrity sha512-tGLDVyemseglpXyt3MMnggWL2ROYglRGoL0lKVy+GySFcrD4YQbt5iyvrY9hcEnN62gmkFLIFRinIq5niqYKXg== - dependencies: - "@glimmer/syntax" "^0.95.0" - "@typescript-eslint/tsconfig-utils" "^8.57.1" - content-tag "^4.1.1" - ember-estree "^0.6.3" - eslint-scope "^9.1.2" - html-tags "^5.1.0" - mathml-tag-names "^4.0.0" - svg-tags "^1.0.0" - -ember-estree@^0.6.3: - version "0.6.4" - resolved "https://registry.yarnpkg.com/ember-estree/-/ember-estree-0.6.4.tgz#e4fa1303d95f33ecfdbfa2acacc334d4341c890f" - integrity sha512-/0+JLFt200RB/gUfLfRALTFWby6fGS7Bu+NN985Y8gadEntX4KoiYHhOl2hkzvy+AmBi+PbHxBa9QVCV7K/PUg== - dependencies: - "@glimmer/env" "^0.1.7" - "@glimmer/syntax" "^0.95.0" - content-tag "^4.2.0" - oxc-parser "^0.130.0" - -ember-page-title@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/ember-page-title/-/ember-page-title-9.0.3.tgz#803a4b6d77d440ffb3cd32bcb548e1142416fd09" - integrity sha512-fedRHUsvq8tIZgOii8jTrfAyeq+la/9H5eAzhNNwEyzo7nDMmqK2SxsyBUGXprd8fOacsPabLlzlucMi/4mUpA== - dependencies: - "@embroider/addon-shim" "^1.8.7" - "@simple-dom/document" "^1.4.0" - -ember-qunit@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-9.0.4.tgz#3b16131c2b03f657a231b9768b78b57ca18dd9ea" - integrity sha512-rv6gKvrdXdPBTdSZC5co82eIcDWWVR7RjafU/c+5TTz290oXhIHPoVuZbcO2F5RiAqkTW0jKzwkCP8y+2tCjFw== - dependencies: - "@embroider/addon-shim" "^1.9.0" - "@embroider/macros" "^1.16.12" - qunit-theme-ember "^1.0.0" - ember-rfc176-data@^0.3.17: version "0.3.17" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a" integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw== -ember-rfc176-data@^0.3.18: - version "0.3.18" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.18.tgz#bb6fdcef49999981317ea81b6cc9210fb4108d65" - integrity sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q== - ember-router-generator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" @@ -15851,22 +15070,6 @@ ember-source@^6.12.0: silent-error "^1.1.1" simple-html-tokenizer "^0.5.11" -ember-strict-application-resolver@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ember-strict-application-resolver/-/ember-strict-application-resolver-0.1.1.tgz#cb9715f6a0d6f30d6f35272c404597e3ad9fd9b2" - integrity sha512-/49JZ2Yk2ggicAGIoFNWcz05llhe2i+/2dpH5Pv1KlwZOBKkqMMJpTKEB4IMg+FjKBiE0r2yxuZzo9Oly9vc1A== - dependencies: - "@embroider/addon-shim" "^1.8.9" - decorator-transforms "^2.2.2" - -ember-template-lint@^7.9.3: - version "7.9.3" - resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-7.9.3.tgz#f8f8e965a10b6872f8062c49374495b2cef47fed" - integrity sha512-iqC4rv/oVlXViGuf7hlOA/bC550ZqacZKAc8WvQV0ueeCtIYPkYYK+Tc7FwpM8qGx3jiwu/ZsTuNfPInI5pL7Q== - dependencies: - "@lint-todo/utils" "^13.1.1" - content-tag "^3.1.1" - emoji-regex-xs@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz#e8af22e5d9dbd7f7f22d280af3d19d2aab5b0724" @@ -15926,27 +15129,6 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-parser@~5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" - integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== - -engine.io@~6.6.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.2.tgz#32bd845b4db708f8c774a4edef4e5c8a98b3da72" - integrity sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.7.2" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.17.1" - enhanced-resolve@^5.10.0, enhanced-resolve@^5.14.1, enhanced-resolve@^5.18.0, enhanced-resolve@^5.20.0: version "5.20.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz#eeeb3966bea62c348c40a0cc9e7912e2557d0be0" @@ -15955,14 +15137,6 @@ enhanced-resolve@^5.10.0, enhanced-resolve@^5.14.1, enhanced-resolve@^5.18.0, en graceful-fs "^4.2.4" tapable "^2.3.0" -enhanced-resolve@^5.17.1: - version "5.21.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz#fa7fed23679e9169dfb705b8e201924421c4414a" - integrity sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.3.3" - enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -16774,18 +15948,6 @@ escodegen@^2.0.0, escodegen@^2.1.0: optionalDependencies: source-map "~0.6.1" -eslint-compat-utils@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" - integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== - dependencies: - semver "^7.5.4" - -eslint-config-prettier@^10.1.8: - version "10.1.8" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" - integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== - eslint-config-prettier@^9.1.0: version "9.1.2" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz#90deb4fa0259592df774b600dbd1d2249a78ce91" @@ -16809,44 +15971,12 @@ eslint-module-utils@^2.12.1: eslint-plugin-deprecation@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-3.0.0.tgz#c0b6bce543c2a01f231d39a1c54fdfebf3560d48" - integrity sha512-JuVLdNg/uf0Adjg2tpTyYoYaMbwQNn/c78P1HcccokvhtRphgnRjZDKmhlxbxYptppex03zO76f97DD/yQHv7A== - dependencies: - "@typescript-eslint/utils" "^7.0.0" - ts-api-utils "^1.3.0" - tslib "^2.3.1" - -eslint-plugin-ember@^13.2.1: - version "13.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-13.2.1.tgz#195cd18ac0061f49fb3b1e5a49a7e00b3d10385d" - integrity sha512-YJNM+LTLqFcfMW5raaSlvQnM6jQG8W6NAo/fllAGiN7jl3JqjB/r3qZPYxk9kaVoDT3TTpUnERXDdEd3U2WGuA== - dependencies: - "@ember-data/rfc395-data" "^0.0.4" - aria-query "^5.3.2" - axobject-query "^4.1.0" - css-tree "^3.0.1" - editorconfig "^3.0.2" - ember-eslint-parser "^0.11.3" - ember-rfc176-data "^0.3.18" - eslint-utils "^3.0.0" - estraverse "^5.3.0" - html-tags "^3.3.1" - language-tags "^1.0.9" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - mathml-tag-names "^4.0.0" - requireindex "^1.2.0" - snake-case "^3.0.3" - svg-tags "^1.0.0" - -eslint-plugin-es-x@^7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" - integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== + resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-3.0.0.tgz#c0b6bce543c2a01f231d39a1c54fdfebf3560d48" + integrity sha512-JuVLdNg/uf0Adjg2tpTyYoYaMbwQNn/c78P1HcccokvhtRphgnRjZDKmhlxbxYptppex03zO76f97DD/yQHv7A== dependencies: - "@eslint-community/eslint-utils" "^4.1.2" - "@eslint-community/regexpp" "^4.11.0" - eslint-compat-utils "^0.5.1" + "@typescript-eslint/utils" "^7.0.0" + ts-api-utils "^1.3.0" + tslib "^2.3.1" eslint-plugin-import@^2.32.0: version "2.32.0" @@ -16889,20 +16019,6 @@ eslint-plugin-jsdoc@^50.6.1: semver "^7.7.2" spdx-expression-parse "^4.0.0" -eslint-plugin-n@^18.0.1: - version "18.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-18.0.1.tgz#f21f6848648d0fcf11e6d9260ebf1c80994b99f7" - integrity sha512-q3ARhk+eZRc7myR0KHx+R3/GJeOHF+Ir6PK95Pu2tEX8Sl/4BIpmmVLva2kPrjC2gCmn6WHlHm+3yeo6Rxhycw== - dependencies: - "@eslint-community/eslint-utils" "^4.5.0" - enhanced-resolve "^5.17.1" - eslint-plugin-es-x "^7.8.0" - get-tsconfig "^4.8.1" - globals "^15.11.0" - globrex "^0.1.2" - ignore "^5.3.2" - semver "^7.6.3" - eslint-plugin-react-hooks@^4.6.0: version "4.6.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" @@ -16964,36 +16080,6 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" - integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-scope@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.2.tgz#b9de6ace2fab1cff24d2e58d85b74c8fcea39802" - integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== - dependencies: - "@types/esrecurse" "^4.3.1" - "@types/estree" "^1.0.8" - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== - eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -17009,11 +16095,6 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint-visitor-keys@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" - integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== - eslint@8.57.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" @@ -17058,46 +16139,6 @@ eslint@8.57.0: strip-ansi "^6.0.1" text-table "^0.2.0" -eslint@^9.39.4: - version "9.39.4" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.4.tgz#855da1b2e2ad66dc5991195f35e262bcec8117b5" - integrity sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ== - dependencies: - "@eslint-community/eslint-utils" "^4.8.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.21.2" - "@eslint/config-helpers" "^0.4.2" - "@eslint/core" "^0.17.0" - "@eslint/eslintrc" "^3.3.5" - "@eslint/js" "9.39.4" - "@eslint/plugin-kit" "^0.4.1" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - ajv "^6.14.0" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.4.0" - eslint-visitor-keys "^4.2.1" - espree "^10.4.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.5" - natural-compare "^1.4.0" - optionator "^0.9.3" - esm-env@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.2.2.tgz#263c9455c55861f41618df31b20cb571fc20b75e" @@ -17108,7 +16149,7 @@ esm@^3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^10.0.1, espree@^10.3.0, espree@^10.4.0: +espree@^10.3.0: version "10.4.0" resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== @@ -17138,13 +16179,6 @@ esquery@^1.4.2, esquery@^1.6.0: dependencies: estraverse "^5.1.0" -esquery@^1.5.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" - integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== - dependencies: - estraverse "^5.1.0" - esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -17214,11 +16248,6 @@ eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -events-to-array@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-2.0.3.tgz#0cd5ee538baae3ea9ec07539d778a2a6056699bc" - integrity sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ== - events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -17279,24 +16308,6 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" -execa@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-9.6.1.tgz#5b90acedc6bdc0fa9b9a6ddf8f9cbb0c75a7c471" - integrity sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA== - dependencies: - "@sindresorhus/merge-streams" "^4.0.0" - cross-spawn "^7.0.6" - figures "^6.1.0" - get-stream "^9.0.0" - human-signals "^8.0.1" - is-plain-obj "^4.1.0" - is-stream "^4.0.1" - npm-run-path "^6.0.0" - pretty-ms "^9.2.0" - signal-exit "^4.1.0" - strip-final-newline "^4.0.0" - yoctocolors "^2.1.1" - exit-hook@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" @@ -17319,7 +16330,7 @@ expect-type@^1.2.1: resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.1.tgz#af76d8b357cf5fa76c41c09dafb79c549e75f71f" integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== -express@5.2.1, express@^5.2.1: +express@5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== @@ -17634,13 +16645,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a" - integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== - dependencies: - is-unicode-supported "^2.0.0" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -17648,13 +16652,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - file-type@21.3.4: version "21.3.4" resolved "https://registry.yarnpkg.com/file-type/-/file-type-21.3.4.tgz#e3f902faee8ec4aa152909fc902a7a77f9c06725" @@ -17813,20 +16810,12 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0, flatted@^3.2.9: +flatted@^3.1.0: version "3.4.2" resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz" integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== @@ -18201,14 +17190,6 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-stream@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27" - integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== - dependencies: - "@sec-ant/readable-stream" "^0.4.1" - is-stream "^4.0.1" - get-symbol-description@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" @@ -18218,13 +17199,6 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" -get-tsconfig@^4.8.1: - version "4.14.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" - integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== - dependencies: - resolve-pkg-maps "^1.0.0" - getopts@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" @@ -18391,21 +17365,6 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^15.11.0: - version "15.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" - integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== - -globals@^17.6.0: - version "17.6.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.6.0.tgz#0f0be018d5cca8690e6375ead1f65c4bb96191fc" - integrity sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA== - globalthis@^1.0.2, globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -18547,11 +17506,6 @@ gray-matter@^4.0.3: section-matter "^1.0.0" strip-bom-string "^1.0.0" -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - gtoken@^5.0.4: version "5.2.1" resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.2.1.tgz#4dae1fea17270f457954b4a45234bba5fc796d16" @@ -18979,16 +17933,6 @@ html-minifier-terser@^6.0.2: relateurl "^0.2.7" terser "^5.10.0" -html-tags@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -html-tags@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-5.1.0.tgz#ec7214b57b3e50e2a4cec39414454338a94291f8" - integrity sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ== - html-to-image@^1.11.11: version "1.11.11" resolved "https://registry.yarnpkg.com/html-to-image/-/html-to-image-1.11.11.tgz#c0f8a34dc9e4b97b93ff7ea286eb8562642ebbea" @@ -19174,11 +18118,6 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -human-signals@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-8.0.1.tgz#f08bb593b6d1db353933d06156cedec90abe51fb" - integrity sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ== - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -19236,7 +18175,7 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" -ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.2: +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== @@ -19715,7 +18654,7 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-obj@^4.0.0, is-plain-obj@^4.1.0: +is-plain-obj@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== @@ -19798,11 +18737,6 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-stream@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" - integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== - is-string@^1.0.7, is-string@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" @@ -19844,11 +18778,6 @@ is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== -is-unicode-supported@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" - integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== - is-url-superb@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" @@ -20074,7 +19003,7 @@ jiti@^1.19.3, jiti@^1.21.0, jiti@^1.21.6: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== -jiti@^2.1.2, jiti@^2.4.2, jiti@^2.6.1, jiti@~2.6.1: +jiti@^2.1.2, jiti@^2.4.2, jiti@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== @@ -20123,7 +19052,7 @@ js-yaml@^3.10.0, js-yaml@^3.13.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0, js-yaml@^4.1.1: +js-yaml@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz" integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== @@ -20265,11 +19194,6 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -20440,13 +19364,6 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -20515,18 +19432,6 @@ langsmith@^0.3.67: semver "^7.6.3" uuid "^10.0.0" -language-subtag-registry@^0.3.20: - version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - launch-editor@^2.11.1: version "2.12.0" resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.12.0.tgz#cc740f4e0263a6b62ead2485f9896e545321f817" @@ -20603,80 +19508,6 @@ license-webpack-plugin@4.0.2: dependencies: webpack-sources "^3.0.0" -lightningcss-android-arm64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" - integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== - -lightningcss-darwin-arm64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" - integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== - -lightningcss-darwin-x64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" - integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== - -lightningcss-freebsd-x64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" - integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== - -lightningcss-linux-arm-gnueabihf@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" - integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== - -lightningcss-linux-arm64-gnu@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" - integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== - -lightningcss-linux-arm64-musl@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" - integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== - -lightningcss-linux-x64-gnu@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" - integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== - -lightningcss-linux-x64-musl@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" - integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== - -lightningcss-win32-arm64-msvc@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" - integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== - -lightningcss-win32-x64-msvc@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" - integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== - -lightningcss@^1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9" - integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== - dependencies: - detect-libc "^2.0.3" - optionalDependencies: - lightningcss-android-arm64 "1.32.0" - lightningcss-darwin-arm64 "1.32.0" - lightningcss-darwin-x64 "1.32.0" - lightningcss-freebsd-x64 "1.32.0" - lightningcss-linux-arm-gnueabihf "1.32.0" - lightningcss-linux-arm64-gnu "1.32.0" - lightningcss-linux-arm64-musl "1.32.0" - lightningcss-linux-x64-gnu "1.32.0" - lightningcss-linux-x64-musl "1.32.0" - lightningcss-win32-arm64-msvc "1.32.0" - lightningcss-win32-x64-msvc "1.32.0" - lilconfig@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" @@ -20791,11 +19622,6 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -20851,11 +19677,6 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -20901,7 +19722,7 @@ lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.18.1: +lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== @@ -21218,11 +20039,6 @@ math-intrinsics@^1.1.0: resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -mathml-tag-names@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz#295494906312f849a9236e6cd9accc902814d477" - integrity sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ== - mdast-util-definitions@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" @@ -21915,14 +20731,14 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@10.2.4, minimatch@10.2.5, minimatch@^10.2.2, minimatch@^10.2.4, minimatch@^10.2.5, minimatch@~10.2.4: +minimatch@10.2.4, minimatch@10.2.5, minimatch@^10.2.2, minimatch@^10.2.4: version "10.2.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== dependencies: brace-expansion "^5.0.5" -"minimatch@2 || 3", minimatch@3.1.5, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.5, minimatch@~3.0.4: +"minimatch@2 || 3", minimatch@3.1.5, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@~3.0.4: version "3.1.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -22061,11 +20877,6 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" - integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== - mkdist@^1.3.0: version "1.5.4" resolved "https://registry.yarnpkg.com/mkdist/-/mkdist-1.5.4.tgz#c2343fab3297e49896013563fb3b0113a07b65da" @@ -22752,18 +21563,6 @@ node-mock-http@^1.0.0, node-mock-http@^1.0.4: resolved "https://registry.yarnpkg.com/node-mock-http/-/node-mock-http-1.0.4.tgz#21f2ab4ce2fe4fbe8a660d7c5195a1db85e042a4" integrity sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ== -node-notifier@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-10.0.1.tgz#0e82014a15a8456c4cfcdb25858750399ae5f1c7" - integrity sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.5" - shellwords "^0.1.1" - uuid "^8.3.2" - which "^2.0.2" - node-releases@^2.0.27: version "2.0.27" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" @@ -22790,11 +21589,6 @@ node-source-walk@^7.0.1: dependencies: "@babel/parser" "^7.26.7" -node-watch@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.3.tgz#6d4db88e39c8d09d3ea61d6568d80e5975abc7ab" - integrity sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ== - nodemon@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.10.tgz#5015c5eb4fffcb24d98cf9454df14f4fecec9bc1" @@ -23469,34 +22263,6 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" -oxc-parser@^0.130.0: - version "0.130.0" - resolved "https://registry.yarnpkg.com/oxc-parser/-/oxc-parser-0.130.0.tgz#b8f03385db908d9fdfff49c8f37b1748b1f41596" - integrity sha512-X0PJ+NmOok8qP3vK9uaW431ngkdM9UPEK7KG466urtIL2+EYTEgbZK2yqe2MWKJKBjRlFweP/pJPx0x9muMEVw== - dependencies: - "@oxc-project/types" "^0.130.0" - optionalDependencies: - "@oxc-parser/binding-android-arm-eabi" "0.130.0" - "@oxc-parser/binding-android-arm64" "0.130.0" - "@oxc-parser/binding-darwin-arm64" "0.130.0" - "@oxc-parser/binding-darwin-x64" "0.130.0" - "@oxc-parser/binding-freebsd-x64" "0.130.0" - "@oxc-parser/binding-linux-arm-gnueabihf" "0.130.0" - "@oxc-parser/binding-linux-arm-musleabihf" "0.130.0" - "@oxc-parser/binding-linux-arm64-gnu" "0.130.0" - "@oxc-parser/binding-linux-arm64-musl" "0.130.0" - "@oxc-parser/binding-linux-ppc64-gnu" "0.130.0" - "@oxc-parser/binding-linux-riscv64-gnu" "0.130.0" - "@oxc-parser/binding-linux-riscv64-musl" "0.130.0" - "@oxc-parser/binding-linux-s390x-gnu" "0.130.0" - "@oxc-parser/binding-linux-x64-gnu" "0.130.0" - "@oxc-parser/binding-linux-x64-musl" "0.130.0" - "@oxc-parser/binding-openharmony-arm64" "0.130.0" - "@oxc-parser/binding-wasm32-wasi" "0.130.0" - "@oxc-parser/binding-win32-arm64-msvc" "0.130.0" - "@oxc-parser/binding-win32-ia32-msvc" "0.130.0" - "@oxc-parser/binding-win32-x64-msvc" "0.130.0" - oxc-parser@^0.76.0: version "0.76.0" resolved "https://registry.yarnpkg.com/oxc-parser/-/oxc-parser-0.76.0.tgz#041650d3be1b6f31ee74b5c0f8987a6818fa85fd" @@ -23708,11 +22474,6 @@ package-json-from-dist@^1.0.0, package-json-from-dist@^1.0.1: resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -package-manager-detector@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-1.6.0.tgz#70d0cf0aa02c877eeaf66c4d984ede0be9130734" - integrity sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA== - package-name-regex@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/package-name-regex/-/package-name-regex-2.0.6.tgz#b54bcb04d950e38082b7bb38fa558e01c1679334" @@ -23803,11 +22564,6 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== -parse-ms@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" - integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== - parse-node-version@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -24199,7 +22955,7 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-entry-points@^1.1.0, pkg-entry-points@^1.1.1: +pkg-entry-points@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pkg-entry-points/-/pkg-entry-points-1.1.1.tgz#d5cd87f934e873bf73143ed1d0baf637e5f8fda4" integrity sha512-BhZa7iaPmB4b3vKIACoppyUoYn8/sFs17VJJtzrzPZvEnN2nqrgg911tdL65lA2m1ml6UI3iPeYbZQ4VXpn1mA== @@ -24847,7 +23603,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.1.10, postcss@^8.2.14, postcss@^8.3.7, postcss@^8.4.27, postcss@^8.4.39, postcss@^8.4.43, postcss@^8.4.7, postcss@^8.4.8, postcss@^8.5.1, postcss@^8.5.14, postcss@^8.5.3, postcss@^8.5.6: +postcss@^8.1.10, postcss@^8.2.14, postcss@^8.3.7, postcss@^8.4.27, postcss@^8.4.39, postcss@^8.4.43, postcss@^8.4.7, postcss@^8.4.8, postcss@^8.5.1, postcss@^8.5.3, postcss@^8.5.6: version "8.5.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.14.tgz#a66c2d7808fadf69ebb5b84a03f8bafd76c4919c" integrity sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg== @@ -24947,14 +23703,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-plugin-ember-template-tag@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/prettier-plugin-ember-template-tag/-/prettier-plugin-ember-template-tag-2.1.6.tgz#38c2a5f997dad29f59f66bfcbd4a2298cedd0851" - integrity sha512-Y0/Id2dxccxM9pRaBXLT7sc89mc6B0UVX7Lh0SCEPb2WtQuksx4wJx98YATQKKiv5vInPmDLi9RGMipU6vAztQ== - dependencies: - "@babel/traverse" "^7.29.0" - content-tag "^4.2.0" - prettier@^2.5.1: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" @@ -24965,11 +23713,6 @@ prettier@^3.6.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== -prettier@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.3.tgz#560f2de55bf01b4c0503bc629d5df99b9a1d09b0" - integrity sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw== - pretty-bytes@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -25037,18 +23780,6 @@ pretty-ms@^7.0.1: dependencies: parse-ms "^2.1.0" -pretty-ms@^9.2.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.3.0.tgz#dd2524fcb3c326b4931b2272dfd1e1a8ed9a9f5a" - integrity sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ== - dependencies: - parse-ms "^4.0.0" - -printf@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/printf/-/printf-0.6.1.tgz#b9afa3d3b55b7f2e8b1715272479fc756ed88650" - integrity sha512-is0ctgGdPJ5951KulgfzvHGwJtZ5ck8l042vRkV6jrkpBzTmb/lueTqguWHy2JfVA+RY6gFVlaZgUS0j7S/dsw== - prisma@6.15.0: version "6.15.0" resolved "https://registry.yarnpkg.com/prisma/-/prisma-6.15.0.tgz#198f95a4468aba8f3c95b58bf3400f65daeb8942" @@ -25081,11 +23812,6 @@ proc-log@^2.0.0, proc-log@^2.0.1: resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== -proc-log@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-6.1.0.tgz#18519482a37d5198e231133a70144a50f21f0215" - integrity sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -25153,15 +23879,6 @@ propagate@^2.0.0: resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== -proper-lockfile@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" - integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== - dependencies: - graceful-fs "^4.2.4" - retry "^0.12.0" - signal-exit "^3.0.2" - property-information@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" @@ -25232,16 +23949,6 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -publint@^0.3.20: - version "0.3.21" - resolved "https://registry.yarnpkg.com/publint/-/publint-0.3.21.tgz#91e1425f638e2128343d5543f77551915d57409a" - integrity sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ== - dependencies: - "@publint/pack" "^0.1.4" - package-manager-detector "^1.6.0" - picocolors "^1.1.1" - sade "^1.8.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -25309,27 +24016,6 @@ quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: rimraf "^2.5.4" underscore.string "~3.3.4" -qunit-dom@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-3.5.1.tgz#2c0337f4db81cf3923c1f82a902a6be850a2e908" - integrity sha512-ZnvTADVXASdjLxrUDuS/8NaOzadhxN+fZgafjuQV1EOMFd3dJqLkP0RqsGdAxQBxZ7KzKg57AAJO20dM6/PxkA== - dependencies: - dom-element-descriptors "^0.5.1" - -qunit-theme-ember@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/qunit-theme-ember/-/qunit-theme-ember-1.0.0.tgz#3b750b9e3ab2837cc3b31cc5b73a0b71b964b0db" - integrity sha512-vdMVVo6ecdCkWttMTKeyq1ZTLGHcA6zdze2zhguNuc3ritlJMhOXY5RDseqazOwqZVfCg3rtlmL3fMUyIzUyFQ== - -qunit@^2.25.0: - version "2.25.0" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.25.0.tgz#a9bc86543971f378a0af64e81292fbef6c12e1b8" - integrity sha512-MONPKgjavgTqArCwZOEz8nEMbA19zNXIp5ZOW9rPYj5cbgQp0fiI36c9dPTSzTRRzx+KcfB5eggYB/ENqxi0+w== - dependencies: - commander "7.2.0" - node-watch "0.7.3" - tiny-glob "0.2.9" - quote-unquote@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" @@ -26020,11 +24706,6 @@ require-in-the-middle@^8.0.0: debug "^4.3.5" module-details-from-path "^1.0.3" -requireindex@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" - integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== - requirejs-config-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz#4244da5dd1f59874038cc1091d078d620abb6ebc" @@ -26112,11 +24793,6 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - resolve-url-loader@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" @@ -26301,30 +24977,6 @@ roarr@^7.0.4: safe-stable-stringify "^2.4.1" semver-compare "^1.0.0" -rolldown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.0.tgz#9baf1407c4117570f19f75f697c4a0216065d12e" - integrity sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA== - dependencies: - "@oxc-project/types" "=0.129.0" - "@rolldown/pluginutils" "1.0.0" - optionalDependencies: - "@rolldown/binding-android-arm64" "1.0.0" - "@rolldown/binding-darwin-arm64" "1.0.0" - "@rolldown/binding-darwin-x64" "1.0.0" - "@rolldown/binding-freebsd-x64" "1.0.0" - "@rolldown/binding-linux-arm-gnueabihf" "1.0.0" - "@rolldown/binding-linux-arm64-gnu" "1.0.0" - "@rolldown/binding-linux-arm64-musl" "1.0.0" - "@rolldown/binding-linux-ppc64-gnu" "1.0.0" - "@rolldown/binding-linux-s390x-gnu" "1.0.0" - "@rolldown/binding-linux-x64-gnu" "1.0.0" - "@rolldown/binding-linux-x64-musl" "1.0.0" - "@rolldown/binding-openharmony-arm64" "1.0.0" - "@rolldown/binding-wasm32-wasi" "1.0.0" - "@rolldown/binding-win32-arm64-msvc" "1.0.0" - "@rolldown/binding-win32-x64-msvc" "1.0.0" - rolldown@^1.0.0-rc.15, rolldown@^1.0.0-rc.8: version "1.0.0-rc.15" resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.0-rc.15.tgz#ea3526443b2dbe834e9f8f6c1fde6232ec687170" @@ -26554,7 +25206,7 @@ rxjs@7.8.2, rxjs@^7.5.5, rxjs@^7.8.2: dependencies: tslib "^2.1.0" -sade@^1.7.3, sade@^1.8.1: +sade@^1.7.3: version "1.8.1" resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== @@ -27038,7 +25690,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@1.8.3, shell-quote@^1.7.3, shell-quote@^1.8.3: +shell-quote@^1.7.3, shell-quote@^1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== @@ -27052,11 +25704,6 @@ shelljs@^0.8.3: interpret "^1.0.0" rechoir "^0.6.2" -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - shiki@^1.26.1: version "1.29.2" resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.29.2.tgz#5c93771f2d5305ce9c05975c33689116a27dc657" @@ -27194,16 +25841,6 @@ simple-wcswidth@^1.0.1: resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz#66722f37629d5203f9b47c5477b1225b85d6525b" integrity sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw== -sinon@^22.0.0: - version "22.0.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-22.0.0.tgz#01cea95c919468f6ef01e21d406397e5c02aad9b" - integrity sha512-sq/6DpdXOrLyfbKlXLg/Usc7xu8YXPeLkOFZRvA3bNUSA2lhbrZ06yuXbH1fkzBPCbz9O10+7hznzUsjaYNm0Q== - dependencies: - "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^15.4.0" - "@sinonjs/samsam" "^10.0.2" - diff "^9.0.0" - sirv@^3.0.0, sirv@^3.0.1, sirv@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.2.tgz#f775fccf10e22a40832684848d636346f41cd970" @@ -27269,43 +25906,6 @@ smol-toml@1.6.1: resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.6.1.tgz#4fceb5f7c4b86c2544024ef686e12ff0983465be" integrity sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg== -snake-case@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -socket.io-adapter@~2.5.2: - version "2.5.5" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" - integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== - dependencies: - debug "~4.3.4" - ws "~8.17.1" - -socket.io-parser@~4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.6.tgz#19156bf179af3931abd05260cfb1491822578a6f" - integrity sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.4.1" - -socket.io@^4.8.3: - version "4.8.3" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.3.tgz#ca6ba1431c69532e1e0a6f496deebeb601dbc4df" - integrity sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - cors "~2.8.5" - debug "~4.4.1" - engine.io "~6.6.0" - socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.4" - sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -27472,11 +26072,6 @@ sparse-bitfield@^3.0.3: dependencies: memory-pager "^1.0.2" -spawn-args@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" - integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= - spdx-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7" @@ -27919,11 +26514,6 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -strip-final-newline@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c" - integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw== - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -27982,11 +26572,6 @@ styled-jsx@5.1.1: dependencies: client-only "0.0.1" -styled_string@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" - integrity sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko= - stylehacks@^7.0.5: version "7.0.7" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.7.tgz#12b0dd1eceee4d564aae6da0632804ef0004a5be" @@ -28041,13 +26626,6 @@ superjson@^2.2.2: dependencies: copy-anything "^4" -supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-10.0.0.tgz#32000d5e49f1ae70b2645d47701004644a1d7b90" @@ -28067,6 +26645,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -28106,11 +26691,6 @@ svelte@^4.2.8: magic-string "^0.30.4" periscopic "^3.1.0" -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== - svgo@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/svgo/-/svgo-4.0.1.tgz" @@ -28173,32 +26753,11 @@ tagged-tag@^1.0.0: resolved "https://registry.yarnpkg.com/tagged-tag/-/tagged-tag-1.0.0.tgz#a0b5917c2864cba54841495abfa3f6b13edcf4d6" integrity sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng== -tap-parser@^18.3.0: - version "18.3.4" - resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-18.3.4.tgz#503b6c8f20f37476d2e802e7e30b5a25d220cbbb" - integrity sha512-CiqzdpWn2CvONcWp7UNMF9/rCPJwCz0es+qykkgJruu1Y/rAS8A5MEQujmjx9NErfst3dGiZJU3lDS2jBsgbPA== - dependencies: - events-to-array "^2.0.3" - tap-yaml "4.4.2" - -tap-yaml@4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/tap-yaml/-/tap-yaml-4.4.2.tgz#450ee4dcefcb6261bdf7d299b81ee6d9aca61d97" - integrity sha512-03mQI7QhfVZHJqGgFyxNTgUbgsG41ZzpWSb7k1Gangmf9hF71Jpb0Fczs7KtOdUDaHx+KxlPUdM2pQJaijebGA== - dependencies: - yaml "^2.8.3" - yaml-types "^0.4.0" - tapable@^2.0.0, tapable@^2.1.1, tapable@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== -tapable@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" - integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== - tar-fs@^2.0.0: version "2.1.4" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" @@ -28350,36 +26909,6 @@ test-exclude@^7.0.1: glob "^10.4.1" minimatch "^9.0.4" -testem@^3.20.0: - version "3.20.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-3.20.0.tgz#7d6cf0e5ed9e271cf0d6b6617c555fa5c823e7e9" - integrity sha512-SSFfJQK/SGruISFjoKG2jCYwK596wWNPJFj2Wo77GzeIUxZ8ZjuwpyF01uekTLu4ITL6i9R4m1sWaKPK/HsunA== - dependencies: - "@xmldom/xmldom" "^0.9.9" - backbone "^1.6.1" - charm "^1.0.2" - chokidar "^5.0.0" - commander "^14.0.3" - compression "^1.8.1" - consolidate "^1.0.4" - execa "^9.6.1" - express "^5.2.1" - glob "^13.0.6" - http-proxy "^1.18.1" - js-yaml "^4.1.1" - lodash "^4.18.1" - minimatch "^10.2.5" - mkdirp "^3.0.1" - mustache "^4.2.0" - node-notifier "^10.0.1" - printf "^0.6.1" - proc-log "^6.1.0" - rimraf "^6.1.3" - socket.io "^4.8.3" - spawn-args "^0.2.0" - styled_string "0.0.1" - tap-parser "^18.3.0" - text-decoder@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" @@ -28451,7 +26980,7 @@ tildify@2.0.0: resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== -tiny-glob@0.2.9, tiny-glob@^0.2.9: +tiny-glob@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== @@ -28715,11 +27244,6 @@ ts-api-utils@^2.1.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== -ts-api-utils@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" - integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== - ts-graphviz@^2.1.2: version "2.1.6" resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-2.1.6.tgz#007fcb42b4e8c55d26543ece9e86395bd3c3cfd6" @@ -28824,16 +27348,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -28955,16 +27469,6 @@ typescript-auto-import-cache@^0.3.5: dependencies: semver "^7.3.8" -typescript-eslint@^8.59.2: - version "8.59.3" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.59.3.tgz#4a41d9007faa539a66292189e2795eeb0b9fca29" - integrity sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg== - dependencies: - "@typescript-eslint/eslint-plugin" "8.59.3" - "@typescript-eslint/parser" "8.59.3" - "@typescript-eslint/typescript-estree" "8.59.3" - "@typescript-eslint/utils" "8.59.3" - typescript-memoize@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" @@ -28980,7 +27484,7 @@ typescript@^3.9: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== -typescript@^5.7.3, typescript@^5.8.3, typescript@^5.9.3, typescript@~5.9.3: +typescript@^5.7.3, typescript@^5.8.3: version "5.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== @@ -29098,11 +27602,6 @@ underscore.string@~3.3.4: sprintf-js "^1.0.3" util-deprecate "^1.0.2" -underscore@>=1.8.3: - version "1.13.8" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.8.tgz#a93a21186c049dbf0e847496dba72b7bd8c1e92b" - integrity sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ== - undici-types@^5.26: version "5.28.4" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.28.4.tgz#501669b1af1f288a9cbc2e273811965c9178306d" @@ -29516,11 +28015,6 @@ unzip-stream@^0.3.1: binary "^0.3.0" mkdirp "^0.5.1" -upath@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" - integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== - update-browserslist-db@^1.2.0, update-browserslist-db@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" @@ -29871,19 +28365,6 @@ vite@^5.0.0, vite@^5.4.11, vite@^5.4.21: optionalDependencies: fsevents "~2.3.3" -vite@^8.0.11: - version "8.0.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.12.tgz#105cce7bcb60733f9159842ec2a5a10aadf2da86" - integrity sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg== - dependencies: - lightningcss "^1.32.0" - picomatch "^4.0.4" - postcss "^8.5.14" - rolldown "1.0.0" - tinyglobby "^0.2.16" - optionalDependencies: - fsevents "~2.3.3" - vitefu@^0.2.2, vitefu@^0.2.4, vitefu@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" @@ -30672,11 +29153,6 @@ ws@^8.13.0, ws@^8.18.0, ws@^8.18.3, ws@^8.20.0, ws@^8.4.2: resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== -ws@~8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - wsl-utils@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" @@ -30745,11 +29221,6 @@ yallist@^5.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== -yaml-types@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/yaml-types/-/yaml-types-0.4.0.tgz#e0cab9fb563cbf6f5fc0a40dd3b8cc7bfa06365e" - integrity sha512-XfbA30NUg4/LWUiplMbiufUiwYhgB9jvBhTWel7XQqjV+GaB79c2tROu/8/Tu7jO0HvDvnKWtBk5ksWRrhQ/0g== - yaml@^1.10.0: version "1.10.3" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" @@ -30783,19 +29254,6 @@ yargs@17.5.1: y18n "^5.0.5" yargs-parser "^21.0.0" -yargs@17.7.2, yargs@^17.0.1, yargs@^17.2.1, yargs@^17.5.1, yargs@^17.6.0, yargs@^17.6.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yargs@^16.1.1, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -30809,6 +29267,19 @@ yargs@^16.1.1, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.0.1, yargs@^17.2.1, yargs@^17.5.1, yargs@^17.6.0, yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yarn-deduplicate@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-6.0.2.tgz#63498d2d4c3a8567e992a994ce0ab51aa5681f2e" @@ -30842,11 +29313,6 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -yoctocolors@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz#d795f54d173494e7d8db93150cec0ed7f678c83a" - integrity sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== - youch-core@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/youch-core/-/youch-core-0.3.3.tgz#c5d3d85aeea0d8bc7b36e9764ed3f14b7ceddc7d"