From bcdc3459c23a625c2057b7157975e23928582b7c Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Wed, 30 Oct 2024 10:29:53 -0400 Subject: [PATCH 01/31] chore: Upgrade vite dev dep to ^5.4.10 (#14126) resolves all of these warnings: https://github.com/getsentry/sentry-javascript/security/dependabot?q=is%3Aopen+package%3Avite --- .../package.json | 2 +- .../solid-solidrouter/package.json | 2 +- .../test-applications/solid/package.json | 2 +- .../test-applications/solidstart/package.json | 2 +- .../test-applications/svelte-5/package.json | 2 +- .../sveltekit-2-svelte-5/package.json | 2 +- .../sveltekit-2-twp/package.json | 2 +- .../sveltekit-2/package.json | 2 +- .../test-applications/sveltekit/package.json | 2 +- .../tanstack-router/package.json | 2 +- .../test-applications/vue-3/package.json | 2 +- packages/astro/package.json | 2 +- packages/remix/package.json | 2 +- packages/sveltekit/package.json | 2 +- yarn.lock | 247 +++++------------- 15 files changed, 78 insertions(+), 197 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/create-remix-app-express-vite-dev/package.json b/dev-packages/e2e-tests/test-applications/create-remix-app-express-vite-dev/package.json index 5ba4b54d8e8f..b7876bb08e44 100644 --- a/dev-packages/e2e-tests/test-applications/create-remix-app-express-vite-dev/package.json +++ b/dev-packages/e2e-tests/test-applications/create-remix-app-express-vite-dev/package.json @@ -45,7 +45,7 @@ "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "typescript": "^5.1.6", - "vite": "^5.1.0", + "vite": "^5.4.10", "vite-tsconfig-paths": "^4.2.1" }, "volta": { diff --git a/dev-packages/e2e-tests/test-applications/solid-solidrouter/package.json b/dev-packages/e2e-tests/test-applications/solid-solidrouter/package.json index 26f2ee5ba342..bec942865d84 100644 --- a/dev-packages/e2e-tests/test-applications/solid-solidrouter/package.json +++ b/dev-packages/e2e-tests/test-applications/solid-solidrouter/package.json @@ -22,7 +22,7 @@ "postcss": "^8.4.33", "solid-devtools": "^0.29.2", "tailwindcss": "^3.4.1", - "vite": "^5.0.11", + "vite": "^5.4.10", "vite-plugin-solid": "^2.8.2" }, "dependencies": { diff --git a/dev-packages/e2e-tests/test-applications/solid/package.json b/dev-packages/e2e-tests/test-applications/solid/package.json index 6d56a61d08cf..b4d896b081af 100644 --- a/dev-packages/e2e-tests/test-applications/solid/package.json +++ b/dev-packages/e2e-tests/test-applications/solid/package.json @@ -22,7 +22,7 @@ "postcss": "^8.4.33", "solid-devtools": "^0.29.2", "tailwindcss": "^3.4.1", - "vite": "^5.0.11", + "vite": "^5.4.10", "vite-plugin-solid": "^2.8.2" }, "dependencies": { diff --git a/dev-packages/e2e-tests/test-applications/solidstart/package.json b/dev-packages/e2e-tests/test-applications/solidstart/package.json index 97a7e8812d73..5222cd85faf9 100644 --- a/dev-packages/e2e-tests/test-applications/solidstart/package.json +++ b/dev-packages/e2e-tests/test-applications/solidstart/package.json @@ -27,7 +27,7 @@ "solid-js": "1.8.17", "typescript": "^5.4.5", "vinxi": "^0.4.0", - "vite": "^5.2.8", + "vite": "^5.4.10", "vite-plugin-solid": "^2.10.2", "vitest": "^1.5.0" }, diff --git a/dev-packages/e2e-tests/test-applications/svelte-5/package.json b/dev-packages/e2e-tests/test-applications/svelte-5/package.json index 82c256519a36..9b6d6c5d0420 100644 --- a/dev-packages/e2e-tests/test-applications/svelte-5/package.json +++ b/dev-packages/e2e-tests/test-applications/svelte-5/package.json @@ -23,7 +23,7 @@ "svelte-check": "^3.6.7", "tslib": "^2.6.2", "typescript": "^5.2.2", - "vite": "^5.2.0" + "vite": "^5.4.10" }, "dependencies": { "@sentry/svelte": "latest || *" diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/package.json b/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/package.json index ef59fc456b5f..466e9feb5ffb 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/package.json +++ b/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/package.json @@ -30,7 +30,7 @@ "svelte-check": "^3.6.0", "tslib": "^2.4.1", "typescript": "^5.0.0", - "vite": "^5.0.3" + "vite": "^5.4.10" }, "type": "module" } diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-2-twp/package.json b/dev-packages/e2e-tests/test-applications/sveltekit-2-twp/package.json index a88decc74e7b..f03ee63f4fa0 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-2-twp/package.json +++ b/dev-packages/e2e-tests/test-applications/sveltekit-2-twp/package.json @@ -29,7 +29,7 @@ "svelte-check": "^3.6.0", "tslib": "^2.4.1", "typescript": "^5.0.0", - "vite": "^5.0.3" + "vite": "^5.4.10" }, "type": "module" } diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-2/package.json b/dev-packages/e2e-tests/test-applications/sveltekit-2/package.json index 738f4a51bb3d..d39fc123293a 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-2/package.json +++ b/dev-packages/e2e-tests/test-applications/sveltekit-2/package.json @@ -29,7 +29,7 @@ "svelte": "^4.2.8", "svelte-check": "^3.6.0", "typescript": "^5.0.0", - "vite": "^5.0.3" + "vite": "^5.4.10" }, "type": "module" } diff --git a/dev-packages/e2e-tests/test-applications/sveltekit/package.json b/dev-packages/e2e-tests/test-applications/sveltekit/package.json index e6b109c437dc..563307252785 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit/package.json +++ b/dev-packages/e2e-tests/test-applications/sveltekit/package.json @@ -27,7 +27,7 @@ "svelte": "^3.54.0", "svelte-check": "^3.0.1", "typescript": "^5.0.0", - "vite": "^4.2.0" + "vite": "^4.5.2" }, "type": "module" } diff --git a/dev-packages/e2e-tests/test-applications/tanstack-router/package.json b/dev-packages/e2e-tests/test-applications/tanstack-router/package.json index f2b82afa15c8..ccb6891b2bc7 100644 --- a/dev-packages/e2e-tests/test-applications/tanstack-router/package.json +++ b/dev-packages/e2e-tests/test-applications/tanstack-router/package.json @@ -24,7 +24,7 @@ "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react-swc": "^3.5.0", "typescript": "^5.2.2", - "vite": "^5.2.14", + "vite": "^5.4.10", "@playwright/test": "^1.44.1", "@sentry-internal/test-utils": "link:../../../test-utils" }, diff --git a/dev-packages/e2e-tests/test-applications/vue-3/package.json b/dev-packages/e2e-tests/test-applications/vue-3/package.json index aab0c6f3b744..7c530c8acf06 100644 --- a/dev-packages/e2e-tests/test-applications/vue-3/package.json +++ b/dev-packages/e2e-tests/test-applications/vue-3/package.json @@ -33,7 +33,7 @@ "http-server": "^14.1.1", "npm-run-all2": "^6.2.0", "typescript": "~5.3.0", - "vite": "^5.0.11", + "vite": "^5.4.10", "vue-tsc": "^1.8.27" }, "volta": { diff --git a/packages/astro/package.json b/packages/astro/package.json index 480e883f801d..743528acda3a 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -65,7 +65,7 @@ }, "devDependencies": { "astro": "^3.5.0", - "vite": "4.5.5" + "vite": "^5.4.10" }, "scripts": { "build": "run-p build:transpile build:types", diff --git a/packages/remix/package.json b/packages/remix/package.json index b389f2e663db..de05f879740d 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -68,7 +68,7 @@ "@remix-run/node": "^1.4.3", "@remix-run/react": "^1.4.3", "@types/express": "^4.17.14", - "vite": "^5.2.11", + "vite": "^5.4.10", "vitest": "^1.6.0" }, "peerDependencies": { diff --git a/packages/sveltekit/package.json b/packages/sveltekit/package.json index fd614c8d00ae..f620ba0a83e1 100644 --- a/packages/sveltekit/package.json +++ b/packages/sveltekit/package.json @@ -55,7 +55,7 @@ "@babel/types": "7.20.7", "@sveltejs/kit": "^2.0.2", "svelte": "^4.2.8", - "vite": "^5.0.10" + "vite": "^5.4.10" }, "scripts": { "build": "run-p build:transpile build:types", diff --git a/yarn.lock b/yarn.lock index 9d3139160e51..d2dedd157477 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4335,11 +4335,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz#74752a09301b8c6b9a415fbda9fb71406a62a7b7" integrity sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg== -"@esbuild/android-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz#683794bdc3d27222d3eced7b74cad15979548031" - integrity sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ== - "@esbuild/android-arm64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz#109a6fdc4a2783fc26193d2687827045d8fef5ab" @@ -4385,11 +4380,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.4.tgz#c27363e1e280e577d9b5c8fa7c7a3be2a8d79bf5" integrity sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ== -"@esbuild/android-arm@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.9.tgz#21a4de41f07b2af47401c601d64dfdefd056c595" - integrity sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA== - "@esbuild/android-arm@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.0.tgz#1397a2c54c476c4799f9b9073550ede496c94ba5" @@ -4430,11 +4420,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.4.tgz#6c9ee03d1488973d928618100048b75b147e0426" integrity sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g== -"@esbuild/android-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.9.tgz#e2d7674bc025ddc8699f0cc76cb97823bb63c252" - integrity sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA== - "@esbuild/android-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.0.tgz#2b615abefb50dc0a70ac313971102f4ce2fdb3ca" @@ -4475,11 +4460,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz#64e2ee945e5932cd49812caa80e8896e937e2f8b" integrity sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA== -"@esbuild/darwin-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz#ae7a582289cc5c0bac15d4b9020a90cb7288f1e9" - integrity sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw== - "@esbuild/darwin-arm64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz#5c122ed799eb0c35b9d571097f77254964c276a2" @@ -4520,11 +4500,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz#d8e26e1b965df284692e4d1263ba69a49b39ac7a" integrity sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw== -"@esbuild/darwin-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz#8a216c66dcf51addeeb843d8cfaeff712821d12b" - integrity sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ== - "@esbuild/darwin-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz#9561d277002ba8caf1524f209de2b22e93d170c1" @@ -4565,11 +4540,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz#29751a41b242e0a456d89713b228f1da4f45582f" integrity sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ== -"@esbuild/freebsd-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz#63d4f603e421252c3cd836b18d01545be7c6c440" - integrity sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g== - "@esbuild/freebsd-arm64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz#84178986a3138e8500d17cc380044868176dd821" @@ -4610,11 +4580,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz#873edc0f73e83a82432460ea59bf568c1e90b268" integrity sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw== -"@esbuild/freebsd-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz#a3db52595be65360eae4de1d1fa3c1afd942e1e4" - integrity sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA== - "@esbuild/freebsd-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz#3f9ce53344af2f08d178551cd475629147324a83" @@ -4655,11 +4620,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz#659f2fa988d448dbf5010b5cc583be757cc1b914" integrity sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA== -"@esbuild/linux-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz#4ae5811ce9f8d7df5eb9edd9765ea9401a534f13" - integrity sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ== - "@esbuild/linux-arm64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz#24efa685515689df4ecbc13031fa0a9dda910a11" @@ -4700,11 +4660,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz#d5b13a7ec1f1c655ce05c8d319b3950797baee55" integrity sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg== -"@esbuild/linux-arm@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz#9807e92cfd335f46326394805ad488e646e506f2" - integrity sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw== - "@esbuild/linux-arm@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz#6b586a488e02e9b073a75a957f2952b3b6e87b4c" @@ -4745,11 +4700,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz#878cd8bf24c9847c77acdb5dd1b2ef6e4fa27a82" integrity sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ== -"@esbuild/linux-ia32@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz#18892c10f3106652b16f9da88a0362dc95ed46c7" - integrity sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q== - "@esbuild/linux-ia32@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz#84ce7864f762708dcebc1b123898a397dea13624" @@ -4800,11 +4750,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz#df890499f6e566b7de3aa2361be6df2b8d5fa015" integrity sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg== -"@esbuild/linux-loong64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz#dc2ebf9a125db0a1bba18c2bbfd4fbdcbcaf61c2" - integrity sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA== - "@esbuild/linux-loong64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz#1922f571f4cae1958e3ad29439c563f7d4fd9037" @@ -4845,11 +4790,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz#76eae4e88d2ce9f4f1b457e93892e802851b6807" integrity sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw== -"@esbuild/linux-mips64el@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz#4c2f7c5d901015e3faf1563c4a89a50776cb07fd" - integrity sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw== - "@esbuild/linux-mips64el@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz#7ca1bd9df3f874d18dbf46af009aebdb881188fe" @@ -4890,11 +4830,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz#c49032f4abbcfa3f747b543a106931fe3dce41ff" integrity sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw== -"@esbuild/linux-ppc64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz#8385332713b4e7812869622163784a5633f76fc4" - integrity sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ== - "@esbuild/linux-ppc64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz#8f95baf05f9486343bceeb683703875d698708a4" @@ -4935,11 +4870,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz#0f815a090772138503ee0465a747e16865bf94b1" integrity sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig== -"@esbuild/linux-riscv64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz#23f1db24fa761be311874f32036c06249aa20cba" - integrity sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg== - "@esbuild/linux-riscv64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz#ca63b921d5fe315e28610deb0c195e79b1a262ca" @@ -4980,11 +4910,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz#8d2cca20cd4e7c311fde8701d9f1042664f8b92b" integrity sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg== -"@esbuild/linux-s390x@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz#2dffe497726b897c9f0109e774006e25b33b4fd0" - integrity sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw== - "@esbuild/linux-s390x@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz#cb3d069f47dc202f785c997175f2307531371ef8" @@ -5025,11 +4950,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz#f618bec2655de49bff91c588777e37b5e3169d4a" integrity sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg== -"@esbuild/linux-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz#ceb1d62cd830724ff5b218e5d3172a8bad59420e" - integrity sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A== - "@esbuild/linux-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz#ac617e0dc14e9758d3d7efd70288c14122557dc7" @@ -5070,11 +4990,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz#7889744ca4d60f1538d62382b95e90a49687cef2" integrity sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A== -"@esbuild/netbsd-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz#0cbca65e9ef4d3fc41502d3e055e6f49479a8f18" - integrity sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug== - "@esbuild/netbsd-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz#6cc778567f1513da6e08060e0aeb41f82eb0f53c" @@ -5125,11 +5040,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz#c3e436eb9271a423d2e8436fcb120e3fd90e2b01" integrity sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw== -"@esbuild/openbsd-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz#1f57adfbee09c743292c6758a3642e875bcad1cf" - integrity sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw== - "@esbuild/openbsd-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz#76848bcf76b4372574fb4d06cd0ed1fb29ec0fbe" @@ -5170,11 +5080,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz#f63f5841ba8c8c1a1c840d073afc99b53e8ce740" integrity sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw== -"@esbuild/sunos-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz#116be6adbd2c7479edeeb5f6ea0441002ab4cb9c" - integrity sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw== - "@esbuild/sunos-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz#ea4cd0639bf294ad51bc08ffbb2dac297e9b4706" @@ -5215,11 +5120,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz#80be69cec92da4da7781cf7a8351b95cc5a236b0" integrity sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w== -"@esbuild/win32-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz#2be22131ab18af4693fd737b161d1ef34de8ca9d" - integrity sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg== - "@esbuild/win32-arm64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz#a5c171e4a7f7e4e8be0e9947a65812c1535a7cf0" @@ -5260,11 +5160,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz#15dc0ed83d2794872b05d8edc4a358fecf97eb54" integrity sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg== -"@esbuild/win32-ia32@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz#e10ead5a55789b167b4225d2469324538768af7c" - integrity sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg== - "@esbuild/win32-ia32@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz#f8ac5650c412d33ea62d7551e0caf82da52b7f85" @@ -5305,11 +5200,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz#d46a6e220a717f31f39ae80f49477cc3220be0f0" integrity sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA== -"@esbuild/win32-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz#b2da6219b603e3fa371a78f53f5361260d0c5585" - integrity sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ== - "@esbuild/win32-x64@0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz#2efddf82828aac85e64cef62482af61c29561bee" @@ -9687,7 +9577,17 @@ dependencies: "@types/unist" "*" -"@types/history-4@npm:@types/history@4.7.8", "@types/history-5@npm:@types/history@4.7.8", "@types/history@*": +"@types/history-4@npm:@types/history@4.7.8": + version "4.7.8" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" + integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== + +"@types/history-5@npm:@types/history@4.7.8": + version "4.7.8" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" + integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== + +"@types/history@*": version "4.7.8" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== @@ -10010,7 +9910,15 @@ "@types/history" "^3" "@types/react" "*" -"@types/react-router-4@npm:@types/react-router@5.1.14", "@types/react-router-5@npm:@types/react-router@5.1.14": +"@types/react-router-4@npm:@types/react-router@5.1.14": + version "5.1.14" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.14.tgz#e0442f4eb4c446541ad7435d44a97f8fe6df40da" + integrity sha512-LAJpqYUaCTMT2anZheoidiIymt8MuX286zoVFPM3DVb23aQBH0mAkFvzpd4LKqiolV8bBtZWT5Qp7hClCNDENw== + dependencies: + "@types/history" "*" + "@types/react" "*" + +"@types/react-router-5@npm:@types/react-router@5.1.14": version "5.1.14" resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.14.tgz#e0442f4eb4c446541ad7435d44a97f8fe6df40da" integrity sha512-LAJpqYUaCTMT2anZheoidiIymt8MuX286zoVFPM3DVb23aQBH0mAkFvzpd4LKqiolV8bBtZWT5Qp7hClCNDENw== @@ -17413,34 +17321,6 @@ esbuild@^0.19.2: "@esbuild/win32-ia32" "0.19.4" "@esbuild/win32-x64" "0.19.4" -esbuild@^0.19.3: - version "0.19.9" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.9.tgz#423a8f35153beb22c0b695da1cd1e6c0c8cdd490" - integrity sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg== - optionalDependencies: - "@esbuild/android-arm" "0.19.9" - "@esbuild/android-arm64" "0.19.9" - "@esbuild/android-x64" "0.19.9" - "@esbuild/darwin-arm64" "0.19.9" - "@esbuild/darwin-x64" "0.19.9" - "@esbuild/freebsd-arm64" "0.19.9" - "@esbuild/freebsd-x64" "0.19.9" - "@esbuild/linux-arm" "0.19.9" - "@esbuild/linux-arm64" "0.19.9" - "@esbuild/linux-ia32" "0.19.9" - "@esbuild/linux-loong64" "0.19.9" - "@esbuild/linux-mips64el" "0.19.9" - "@esbuild/linux-ppc64" "0.19.9" - "@esbuild/linux-riscv64" "0.19.9" - "@esbuild/linux-s390x" "0.19.9" - "@esbuild/linux-x64" "0.19.9" - "@esbuild/netbsd-x64" "0.19.9" - "@esbuild/openbsd-x64" "0.19.9" - "@esbuild/sunos-x64" "0.19.9" - "@esbuild/win32-arm64" "0.19.9" - "@esbuild/win32-ia32" "0.19.9" - "@esbuild/win32-x64" "0.19.9" - esbuild@^0.20.1, esbuild@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" @@ -27806,15 +27686,6 @@ postcss@^8.4.23, postcss@^8.4.36, postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -postcss@^8.4.32: - version "8.4.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@^8.4.39: version "8.4.40" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.40.tgz#eb81f2a4dd7668ed869a6db25999e02e9ad909d8" @@ -28461,7 +28332,7 @@ react-is@^18.0.0: dependencies: "@remix-run/router" "1.0.2" -"react-router-6@npm:react-router@6.3.0", react-router@6.3.0: +"react-router-6@npm:react-router@6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== @@ -28476,6 +28347,13 @@ react-router-dom@^6.2.2: history "^5.2.0" react-router "6.3.0" +react-router@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" + integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== + dependencies: + history "^5.2.0" + react@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" @@ -29522,7 +29400,7 @@ rollup@^2.70.0: optionalDependencies: fsevents "~2.3.2" -rollup@^4.13.0, rollup@^4.18.0, rollup@^4.2.0, rollup@^4.20.0, rollup@^4.24.2: +rollup@^4.13.0, rollup@^4.18.0, rollup@^4.20.0, rollup@^4.24.2: version "4.24.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.2.tgz#04bbe819c1a0cd933533b79687f5dc43efb7a7f0" integrity sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww== @@ -30916,7 +30794,16 @@ string-template@~0.2.1: resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= -"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@4.2.3, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -31028,7 +30915,14 @@ stringify-object@^3.2.1: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -33272,17 +33166,6 @@ vite-plugin-vue-inspector@^5.2.0: kolorist "^1.8.0" magic-string "^0.30.4" -vite@4.5.5: - version "4.5.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.5.tgz#639b9feca5c0a3bfe3c60cb630ef28bf219d742e" - integrity sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ== - dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" - optionalDependencies: - fsevents "~2.3.2" - vite@^4.4.9: version "4.4.11" resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.11.tgz#babdb055b08c69cfc4c468072a2e6c9ca62102b0" @@ -33305,25 +33188,14 @@ vite@^5.0.0: optionalDependencies: fsevents "~2.3.3" -vite@^5.0.10: - version "5.0.10" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.10.tgz#1e13ef5c3cf5aa4eed81f5df6d107b3c3f1f6356" - integrity sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw== +vite@^5.4.10: + version "5.4.10" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.10.tgz#d358a7bd8beda6cf0f3b7a450a8c7693a4f80c18" + integrity sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ== dependencies: - esbuild "^0.19.3" - postcss "^8.4.32" - rollup "^4.2.0" - optionalDependencies: - fsevents "~2.3.3" - -vite@^5.2.11: - version "5.2.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" - integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== - dependencies: - esbuild "^0.20.1" - postcss "^8.4.38" - rollup "^4.13.0" + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: fsevents "~2.3.3" @@ -34069,7 +33941,16 @@ wrangler@^3.67.1: optionalDependencies: fsevents "~2.3.2" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@7.0.0, wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From 0d290a08729c279d4a1c650aa0c8682d72b53d7b Mon Sep 17 00:00:00 2001 From: Andrei <168741329+andreiborza@users.noreply.github.com> Date: Wed, 30 Oct 2024 16:49:52 +0100 Subject: [PATCH 02/31] test(e2e): Add SolidStart spa mode test app (#14127) While working on the plugin to auto instrument the server I noticed that running SolidStart in spa mode (`ssr: false`) behaved slightly differently so I added a test app for this. --- .github/workflows/build.yml | 1 + .../solidstart-spa/.gitignore | 46 +++++++++ .../test-applications/solidstart-spa/.npmrc | 2 + .../solidstart-spa/README.md | 45 +++++++++ .../solidstart-spa/app.config.ts | 9 ++ .../solidstart-spa/package.json | 37 +++++++ .../solidstart-spa/playwright.config.mjs | 8 ++ .../solidstart-spa/post_build.sh | 8 ++ .../solidstart-spa/public/favicon.ico | Bin 0 -> 664 bytes .../solidstart-spa/src/app.tsx | 22 ++++ .../solidstart-spa/src/entry-client.tsx | 18 ++++ .../solidstart-spa/src/entry-server.tsx | 21 ++++ .../solidstart-spa/src/instrument.server.mjs | 9 ++ .../src/routes/back-navigation.tsx | 9 ++ .../src/routes/client-error.tsx | 15 +++ .../src/routes/error-boundary.tsx | 64 ++++++++++++ .../solidstart-spa/src/routes/index.tsx | 31 ++++++ .../src/routes/server-error.tsx | 17 ++++ .../solidstart-spa/src/routes/users/[id].tsx | 21 ++++ .../solidstart-spa/start-event-proxy.mjs | 6 ++ .../tests/errorboundary.test.ts | 90 +++++++++++++++++ .../tests/errors.client.test.ts | 30 ++++++ .../tests/errors.server.test.ts | 29 ++++++ .../tests/performance.client.test.ts | 95 ++++++++++++++++++ .../tests/performance.server.test.ts | 55 ++++++++++ .../solidstart-spa/tsconfig.json | 19 ++++ .../solidstart-spa/vitest.config.ts | 10 ++ .../test-applications/solidstart/package.json | 2 +- .../tests/performance.client.test.ts | 4 +- 29 files changed, 719 insertions(+), 4 deletions(-) create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/.gitignore create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/.npmrc create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/README.md create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/app.config.ts create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/package.json create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/playwright.config.mjs create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/post_build.sh create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/public/favicon.ico create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/app.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-client.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-server.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/instrument.server.mjs create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/back-navigation.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/client-error.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/error-boundary.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/index.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/server-error.tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/users/[id].tsx create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/start-event-proxy.mjs create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errorboundary.test.ts create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.client.test.ts create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.server.test.ts create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.client.test.ts create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.server.test.ts create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/tsconfig.json create mode 100644 dev-packages/e2e-tests/test-applications/solidstart-spa/vitest.config.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f07002e0c5b..c17b81246e79 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -914,6 +914,7 @@ jobs: 'react-router-6', 'solid', 'solidstart', + 'solidstart-spa', 'svelte-5', 'sveltekit', 'sveltekit-2', diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/.gitignore b/dev-packages/e2e-tests/test-applications/solidstart-spa/.gitignore new file mode 100644 index 000000000000..a51ed3c20c8d --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/.gitignore @@ -0,0 +1,46 @@ + +dist +.solid +.output +.vercel +.netlify +.vinxi + +# Environment +.env +.env*.local + +# dependencies +/node_modules +/.pnp +.pnp.js + +# IDEs and editors +/.idea +.project +.classpath +*.launch +.settings/ + +# Temp +gitignore + +# testing +/coverage + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +/test-results/ +/playwright-report/ +/playwright/.cache/ + +!*.d.ts diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/.npmrc b/dev-packages/e2e-tests/test-applications/solidstart-spa/.npmrc new file mode 100644 index 000000000000..070f80f05092 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/.npmrc @@ -0,0 +1,2 @@ +@sentry:registry=http://127.0.0.1:4873 +@sentry-internal:registry=http://127.0.0.1:4873 diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/README.md b/dev-packages/e2e-tests/test-applications/solidstart-spa/README.md new file mode 100644 index 000000000000..9a141e9c2f0d --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/README.md @@ -0,0 +1,45 @@ +# SolidStart + +Everything you need to build a Solid project, powered by [`solid-start`](https://start.solidjs.com); + +## Creating a project + +```bash +# create a new project in the current directory +npm init solid@latest + +# create a new project in my-app +npm init solid@latest my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a +development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +Solid apps are built with _presets_, which optimise your project for deployment to different environments. + +By default, `npm run build` will generate a Node app that you can run with `npm start`. To use a different preset, add +it to the `devDependencies` in `package.json` and specify in your `app.config.js`. + +## Testing + +Tests are written with `vitest`, `@solidjs/testing-library` and `@testing-library/jest-dom` to extend expect with some +helpful custom matchers. + +To run them, simply start: + +```sh +npm test +``` + +## This project was created with the [Solid CLI](https://solid-cli.netlify.app) diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/app.config.ts b/dev-packages/e2e-tests/test-applications/solidstart-spa/app.config.ts new file mode 100644 index 000000000000..d329d6066fc7 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/app.config.ts @@ -0,0 +1,9 @@ +import { sentrySolidStartVite } from '@sentry/solidstart'; +import { defineConfig } from '@solidjs/start/config'; + +export default defineConfig({ + ssr: false, + vite: { + plugins: [sentrySolidStartVite()], + }, +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/package.json b/dev-packages/e2e-tests/test-applications/solidstart-spa/package.json new file mode 100644 index 000000000000..c23b50b766f3 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/package.json @@ -0,0 +1,37 @@ +{ + "name": "solidstart-spa-e2e-testapp", + "version": "0.0.0", + "scripts": { + "clean": "pnpx rimraf node_modules pnpm-lock.yaml .vinxi .output", + "dev": "NODE_OPTIONS='--import ./src/instrument.server.mjs' vinxi dev", + "build": "vinxi build && sh ./post_build.sh", + "preview": "HOST=localhost PORT=3030 NODE_OPTIONS='--import ./src/instrument.server.mjs' vinxi start", + "test:prod": "TEST_ENV=production playwright test", + "test:build": "pnpm install && npx playwright install && pnpm build", + "test:assert": "pnpm test:prod" + }, + "type": "module", + "dependencies": { + "@sentry/solidstart": "latest || *" + }, + "devDependencies": { + "@playwright/test": "^1.44.1", + "@solidjs/meta": "^0.29.4", + "@solidjs/router": "^0.13.4", + "@solidjs/start": "^1.0.2", + "@solidjs/testing-library": "^0.8.7", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/user-event": "^14.5.2", + "@vitest/ui": "^1.5.0", + "jsdom": "^24.0.0", + "solid-js": "1.8.17", + "typescript": "^5.4.5", + "vinxi": "^0.4.0", + "vite": "^5.2.8", + "vite-plugin-solid": "^2.10.2", + "vitest": "^1.5.0" + }, + "overrides": { + "@vercel/nft": "0.27.4" + } +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/solidstart-spa/playwright.config.mjs new file mode 100644 index 000000000000..395acfc282f9 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/playwright.config.mjs @@ -0,0 +1,8 @@ +import { getPlaywrightConfig } from '@sentry-internal/test-utils'; + +const config = getPlaywrightConfig({ + startCommand: 'pnpm preview', + port: 3030, +}); + +export default config; diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/post_build.sh b/dev-packages/e2e-tests/test-applications/solidstart-spa/post_build.sh new file mode 100644 index 000000000000..6ed67c9afb8a --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/post_build.sh @@ -0,0 +1,8 @@ +# TODO: Investigate the need for this script periodically and remove once these modules are correctly resolved. + +# This script copies `import-in-the-middle` and `@sentry/solidstart` from the E2E test project root `node_modules` +# to the nitro server build output `node_modules` as these are not properly resolved in our yarn workspace/pnpm +# e2e structure. Some files like `hook.mjs` and `@sentry/solidstart/solidrouter.server.js` are missing. This is +# not reproducible in an external project (when pinning `@vercel/nft` to `v0.27.0` and higher). +cp -r node_modules/.pnpm/import-in-the-middle@1.*/node_modules/import-in-the-middle .output/server/node_modules +cp -rL node_modules/@sentry/solidstart .output/server/node_modules/@sentry diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/public/favicon.ico b/dev-packages/e2e-tests/test-applications/solidstart-spa/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fb282da0719ef6ab4c1732df93be6216b0d85520 GIT binary patch literal 664 zcmV;J0%!e+P)m9ebk1R zejT~~6f_`?;`cEd!+`7(hw@%%2;?RN8gX-L?z6cM( zKoG@&w+0}f@Pfvwc+deid)qgE!L$ENKYjViZC_Zcr>L(`2oXUT8f0mRQ(6-=HN_Ai zeBBEz3WP+1Cw`m!49Wf!MnZzp5bH8VkR~BcJ1s-j90TAS2Yo4j!J|KodxYR%3Numw zA?gq6e`5@!W~F$_De3yt&uspo&2yLb$(NwcPPI-4LGc!}HdY%jfq@AFs8LiZ4k(p} zZ!c9o+qbWYs-Mg zgdyTALzJX&7QXHdI_DPTFL33;w}88{e6Zk)MX0kN{3DX9uz#O_L58&XRH$Nvvu;fO zf&)7@?C~$z1K<>j0ga$$MIg+5xN;eQ?1-CA=`^Y169@Ab6!vcaNP=hxfKN%@Ly^R* zK1iv*s1Yl6_dVyz8>ZqYhz6J4|3fQ@2LQeX@^%W(B~8>=MoEmBEGGD1;gHXlpX>!W ym)!leA2L@`cpb^hy)P75=I!`pBYxP7<2VfQ3j76qLgzIA0000 ( + + SolidStart - with Vitest + {props.children} + + )} + > + + + ); +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-client.tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-client.tsx new file mode 100644 index 000000000000..11087fbb5918 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-client.tsx @@ -0,0 +1,18 @@ +// @refresh reload +import * as Sentry from '@sentry/solidstart'; +import { solidRouterBrowserTracingIntegration } from '@sentry/solidstart/solidrouter'; +import { StartClient, mount } from '@solidjs/start/client'; + +Sentry.init({ + // We can't use env variables here, seems like they are stripped + // out in production builds. + dsn: 'https://public@dsn.ingest.sentry.io/1337', + environment: 'qa', // dynamic sampling bias to keep transactions + integrations: [solidRouterBrowserTracingIntegration()], + tunnel: 'http://localhost:3031/', // proxy server + // Performance Monitoring + tracesSampleRate: 1.0, // Capture 100% of the transactions + debug: !!import.meta.env.DEBUG, +}); + +mount(() => , document.getElementById('app')!); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-server.tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-server.tsx new file mode 100644 index 000000000000..276935366318 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/entry-server.tsx @@ -0,0 +1,21 @@ +// @refresh reload +import { StartServer, createHandler } from '@solidjs/start/server'; + +export default createHandler(() => ( + ( + + + + + + {assets} + + +
{children}
+ {scripts} + + + )} + /> +)); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/instrument.server.mjs b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/instrument.server.mjs new file mode 100644 index 000000000000..3dd5d8933b7b --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/instrument.server.mjs @@ -0,0 +1,9 @@ +import * as Sentry from '@sentry/solidstart'; + +Sentry.init({ + dsn: process.env.E2E_TEST_DSN, + environment: 'qa', // dynamic sampling bias to keep transactions + tracesSampleRate: 1.0, // Capture 100% of the transactions + tunnel: 'http://localhost:3031/', // proxy server + debug: !!process.env.DEBUG, +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/back-navigation.tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/back-navigation.tsx new file mode 100644 index 000000000000..ddd970944bf3 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/back-navigation.tsx @@ -0,0 +1,9 @@ +import { A } from '@solidjs/router'; + +export default function BackNavigation() { + return ( + + User 6 + + ); +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/client-error.tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/client-error.tsx new file mode 100644 index 000000000000..5e405e8c4e40 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/client-error.tsx @@ -0,0 +1,15 @@ +export default function ClientErrorPage() { + return ( +
+ +
+ ); +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/error-boundary.tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/error-boundary.tsx new file mode 100644 index 000000000000..b22607667e7e --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/error-boundary.tsx @@ -0,0 +1,64 @@ +import * as Sentry from '@sentry/solidstart'; +import type { ParentProps } from 'solid-js'; +import { ErrorBoundary, createSignal, onMount } from 'solid-js'; + +const SentryErrorBoundary = Sentry.withSentryErrorBoundary(ErrorBoundary); + +const [count, setCount] = createSignal(1); +const [caughtError, setCaughtError] = createSignal(false); + +export default function ErrorBoundaryTestPage() { + return ( + + {caughtError() && ( + + )} +
+
+ +
+
+
+ ); +} + +function Throw(props: { error: string }) { + onMount(() => { + throw new Error(props.error); + }); + return null; +} + +function SampleErrorBoundary(props: ParentProps) { + return ( + ( +
+

Error Boundary Fallback

+
+ {error.message} +
+ +
+ )} + > + {props.children} +
+ ); +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/index.tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/index.tsx new file mode 100644 index 000000000000..9a0b22cc38c6 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/index.tsx @@ -0,0 +1,31 @@ +import { A } from '@solidjs/router'; + +export default function Home() { + return ( + <> +

Welcome to Solid Start

+

+ Visit docs.solidjs.com/solid-start to read the documentation +

+ + + ); +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/server-error.tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/server-error.tsx new file mode 100644 index 000000000000..05dce5e10a56 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/server-error.tsx @@ -0,0 +1,17 @@ +import { withServerActionInstrumentation } from '@sentry/solidstart'; +import { createAsync } from '@solidjs/router'; + +const getPrefecture = async () => { + 'use server'; + return await withServerActionInstrumentation('getPrefecture', () => { + throw new Error('Error thrown from Solid Start E2E test app server route'); + + return { prefecture: 'Kanagawa' }; + }); +}; + +export default function ServerErrorPage() { + const data = createAsync(() => getPrefecture()); + + return
Prefecture: {data()?.prefecture}
; +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/users/[id].tsx b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/users/[id].tsx new file mode 100644 index 000000000000..22abd3ba8803 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/src/routes/users/[id].tsx @@ -0,0 +1,21 @@ +import { withServerActionInstrumentation } from '@sentry/solidstart'; +import { createAsync, useParams } from '@solidjs/router'; + +const getPrefecture = async () => { + 'use server'; + return await withServerActionInstrumentation('getPrefecture', () => { + return { prefecture: 'Ehime' }; + }); +}; +export default function User() { + const params = useParams(); + const userData = createAsync(() => getPrefecture()); + + return ( +
+ User ID: {params.id} +
+ Prefecture: {userData()?.prefecture} +
+ ); +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/solidstart-spa/start-event-proxy.mjs new file mode 100644 index 000000000000..d5aaa038c470 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/start-event-proxy.mjs @@ -0,0 +1,6 @@ +import { startEventProxyServer } from '@sentry-internal/test-utils'; + +startEventProxyServer({ + port: 3031, + proxyServerName: 'solidstart-spa', +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errorboundary.test.ts b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errorboundary.test.ts new file mode 100644 index 000000000000..692e19f54393 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errorboundary.test.ts @@ -0,0 +1,90 @@ +import { expect, test } from '@playwright/test'; +import { waitForError } from '@sentry-internal/test-utils'; + +test('captures an exception', async ({ page }) => { + const errorEventPromise = waitForError('solidstart-spa', errorEvent => { + return ( + !errorEvent.type && + errorEvent.exception?.values?.[0]?.value === + 'Error 1 thrown from Sentry ErrorBoundary in Solid Start E2E test app' + ); + }); + + await page.goto('/error-boundary'); + await page.locator('#caughtErrorBtn').click(); + const errorEvent = await errorEventPromise; + + expect(errorEvent).toMatchObject({ + exception: { + values: [ + { + type: 'Error', + value: 'Error 1 thrown from Sentry ErrorBoundary in Solid Start E2E test app', + mechanism: { + type: 'generic', + handled: true, + }, + }, + ], + }, + transaction: '/error-boundary', + }); +}); + +test('captures a second exception after resetting the boundary', async ({ page }) => { + const firstErrorEventPromise = waitForError('solidstart-spa', errorEvent => { + return ( + !errorEvent.type && + errorEvent.exception?.values?.[0]?.value === + 'Error 1 thrown from Sentry ErrorBoundary in Solid Start E2E test app' + ); + }); + + await page.goto('/error-boundary'); + await page.locator('#caughtErrorBtn').click(); + const firstErrorEvent = await firstErrorEventPromise; + + expect(firstErrorEvent).toMatchObject({ + exception: { + values: [ + { + type: 'Error', + value: 'Error 1 thrown from Sentry ErrorBoundary in Solid Start E2E test app', + mechanism: { + type: 'generic', + handled: true, + }, + }, + ], + }, + transaction: '/error-boundary', + }); + + const secondErrorEventPromise = waitForError('solidstart-spa', errorEvent => { + return ( + !errorEvent.type && + errorEvent.exception?.values?.[0]?.value === + 'Error 2 thrown from Sentry ErrorBoundary in Solid Start E2E test app' + ); + }); + + await page.locator('#errorBoundaryResetBtn').click(); + await page.locator('#caughtErrorBtn').click(); + const secondErrorEvent = await secondErrorEventPromise; + + expect(secondErrorEvent).toMatchObject({ + exception: { + values: [ + { + type: 'Error', + value: 'Error 2 thrown from Sentry ErrorBoundary in Solid Start E2E test app', + mechanism: { + type: 'generic', + handled: true, + }, + }, + ], + }, + transaction: '/error-boundary', + }); +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.client.test.ts b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.client.test.ts new file mode 100644 index 000000000000..12c40ba870be --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.client.test.ts @@ -0,0 +1,30 @@ +import { expect, test } from '@playwright/test'; +import { waitForError } from '@sentry-internal/test-utils'; + +test.describe('client-side errors', () => { + test('captures error thrown on click', async ({ page }) => { + const errorPromise = waitForError('solidstart-spa', async errorEvent => { + return errorEvent?.exception?.values?.[0]?.value === 'Uncaught error thrown from Solid Start E2E test app'; + }); + + await page.goto(`/client-error`); + await page.locator('#errorBtn').click(); + const error = await errorPromise; + + expect(error).toMatchObject({ + exception: { + values: [ + { + type: 'Error', + value: 'Uncaught error thrown from Solid Start E2E test app', + mechanism: { + handled: false, + }, + }, + ], + }, + transaction: '/client-error', + }); + expect(error.transaction).toEqual('/client-error'); + }); +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.server.test.ts b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.server.test.ts new file mode 100644 index 000000000000..be5c635fdd9e --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/errors.server.test.ts @@ -0,0 +1,29 @@ +import { expect, test } from '@playwright/test'; +import { waitForError } from '@sentry-internal/test-utils'; + +test.describe('server-side errors', () => { + test('captures server action error', async ({ page }) => { + const errorEventPromise = waitForError('solidstart-spa', errorEvent => { + return errorEvent?.exception?.values?.[0]?.value === 'Error thrown from Solid Start E2E test app server route'; + }); + + await page.goto(`/server-error`); + + const error = await errorEventPromise; + + expect(error).toMatchObject({ + exception: { + values: [ + { + type: 'Error', + value: 'Error thrown from Solid Start E2E test app server route', + mechanism: { + type: 'solidstart', + handled: false, + }, + }, + ], + }, + }); + }); +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.client.test.ts b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.client.test.ts new file mode 100644 index 000000000000..c689bca22539 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.client.test.ts @@ -0,0 +1,95 @@ +import { expect, test } from '@playwright/test'; +import { waitForTransaction } from '@sentry-internal/test-utils'; + +test('sends a pageload transaction', async ({ page }) => { + const transactionPromise = waitForTransaction('solidstart-spa', async transactionEvent => { + return transactionEvent?.transaction === '/' && transactionEvent.contexts?.trace?.op === 'pageload'; + }); + + await page.goto('/'); + const pageloadTransaction = await transactionPromise; + + expect(pageloadTransaction).toMatchObject({ + contexts: { + trace: { + op: 'pageload', + origin: 'auto.pageload.browser', + }, + }, + transaction: '/', + transaction_info: { + source: 'url', + }, + }); +}); + +test('sends a navigation transaction', async ({ page }) => { + const transactionPromise = waitForTransaction('solidstart-spa', async transactionEvent => { + return transactionEvent?.transaction === '/users/5' && transactionEvent.contexts?.trace?.op === 'navigation'; + }); + + await page.goto(`/`); + await page.locator('#navLink').click(); + const navigationTransaction = await transactionPromise; + + expect(navigationTransaction).toMatchObject({ + contexts: { + trace: { + op: 'navigation', + origin: 'auto.navigation.solidstart.solidrouter', + }, + }, + transaction: '/users/5', + transaction_info: { + source: 'url', + }, + }); +}); + +test('updates the transaction when using the back button', async ({ page }) => { + // Solid Router sends a `-1` navigation when using the back button. + // The sentry solidRouterBrowserTracingIntegration tries to update such + // transactions with the proper name once the `useLocation` hook triggers. + const navigationTxnPromise = waitForTransaction('solidstart-spa', async transactionEvent => { + return transactionEvent?.transaction === '/users/6' && transactionEvent.contexts?.trace?.op === 'navigation'; + }); + + await page.goto(`/back-navigation`); + await page.locator('#navLink').click(); + const navigationTxn = await navigationTxnPromise; + + expect(navigationTxn).toMatchObject({ + contexts: { + trace: { + op: 'navigation', + origin: 'auto.navigation.solidstart.solidrouter', + }, + }, + transaction: '/users/6', + transaction_info: { + source: 'url', + }, + }); + + const backNavigationTxnPromise = waitForTransaction('solidstart-spa', async transactionEvent => { + return ( + transactionEvent?.transaction === '/back-navigation' && transactionEvent.contexts?.trace?.op === 'navigation' + ); + }); + + await page.goBack(); + const backNavigationTxn = await backNavigationTxnPromise; + + expect(backNavigationTxn).toMatchObject({ + contexts: { + trace: { + op: 'navigation', + origin: 'auto.navigation.solidstart.solidrouter', + }, + }, + transaction: '/back-navigation', + transaction_info: { + source: 'url', + }, + }); +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.server.test.ts b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.server.test.ts new file mode 100644 index 000000000000..df56fe841f27 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/tests/performance.server.test.ts @@ -0,0 +1,55 @@ +import { expect, test } from '@playwright/test'; +import { waitForTransaction } from '@sentry-internal/test-utils'; +import { + SEMANTIC_ATTRIBUTE_SENTRY_OP, + SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, + SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, +} from '@sentry/core'; + +test('sends a server action transaction on pageload', async ({ page }) => { + const transactionPromise = waitForTransaction('solidstart-spa', transactionEvent => { + return transactionEvent?.transaction === 'POST getPrefecture'; + }); + + await page.goto('/users/6'); + + const transaction = await transactionPromise; + + expect(transaction.spans).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + description: 'getPrefecture', + data: { + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'function.server_action', + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.solidstart', + [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'component', + }, + }), + ]), + ); +}); + +test('sends a server action transaction on client navigation', async ({ page }) => { + const transactionPromise = waitForTransaction('solidstart-spa', transactionEvent => { + return transactionEvent?.transaction === 'POST getPrefecture'; + }); + + await page.goto('/'); + await page.locator('#navLink').click(); + await page.waitForURL('/users/5'); + + const transaction = await transactionPromise; + + expect(transaction.spans).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + description: 'getPrefecture', + data: { + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'function.server_action', + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.solidstart', + [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'component', + }, + }), + ]), + ); +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/tsconfig.json b/dev-packages/e2e-tests/test-applications/solidstart-spa/tsconfig.json new file mode 100644 index 000000000000..6f11292cc5d8 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "allowJs": true, + "strict": true, + "noEmit": true, + "types": ["vinxi/types/client", "vitest/globals", "@testing-library/jest-dom"], + "isolatedModules": true, + "paths": { + "~/*": ["./src/*"] + } + } +} diff --git a/dev-packages/e2e-tests/test-applications/solidstart-spa/vitest.config.ts b/dev-packages/e2e-tests/test-applications/solidstart-spa/vitest.config.ts new file mode 100644 index 000000000000..6c2b639dc300 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/solidstart-spa/vitest.config.ts @@ -0,0 +1,10 @@ +import solid from 'vite-plugin-solid'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + plugins: [solid()], + resolve: { + conditions: ['development', 'browser'], + }, + envPrefix: 'PUBLIC_', +}); diff --git a/dev-packages/e2e-tests/test-applications/solidstart/package.json b/dev-packages/e2e-tests/test-applications/solidstart/package.json index 5222cd85faf9..dee336da6d07 100644 --- a/dev-packages/e2e-tests/test-applications/solidstart/package.json +++ b/dev-packages/e2e-tests/test-applications/solidstart/package.json @@ -1,5 +1,5 @@ { - "name": "example-with-vitest", + "name": "solidstart-e2e-testapp", "version": "0.0.0", "scripts": { "clean": "pnpx rimraf node_modules pnpm-lock.yaml .vinxi .output", diff --git a/dev-packages/e2e-tests/test-applications/solidstart/tests/performance.client.test.ts b/dev-packages/e2e-tests/test-applications/solidstart/tests/performance.client.test.ts index 2e5df36817ed..52d9cb219401 100644 --- a/dev-packages/e2e-tests/test-applications/solidstart/tests/performance.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/solidstart/tests/performance.client.test.ts @@ -46,9 +46,7 @@ test('sends a navigation transaction', async ({ page }) => { }); }); -// TODO: This test is flaky as of now, so disabling it. -// It often just times out on CI -test.skip('updates the transaction when using the back button', async ({ page }) => { +test('updates the transaction when using the back button', async ({ page }) => { // Solid Router sends a `-1` navigation when using the back button. // The sentry solidRouterBrowserTracingIntegration tries to update such // transactions with the proper name once the `useLocation` hook triggers. From ab208ca8e93a12b16caca4a680557c379d83eddc Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 24 Oct 2024 11:17:26 +0200 Subject: [PATCH 03/31] add flush function --- packages/astro/debug-build.ts | 8 ++++++++ packages/astro/src/server/middleware.ts | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 packages/astro/debug-build.ts diff --git a/packages/astro/debug-build.ts b/packages/astro/debug-build.ts new file mode 100644 index 000000000000..60aa50940582 --- /dev/null +++ b/packages/astro/debug-build.ts @@ -0,0 +1,8 @@ +declare const __DEBUG_BUILD__: boolean; + +/** + * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code. + * + * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking. + */ +export const DEBUG_BUILD = __DEBUG_BUILD__; diff --git a/packages/astro/src/server/middleware.ts b/packages/astro/src/server/middleware.ts index 95d099ff0526..770162c61621 100644 --- a/packages/astro/src/server/middleware.ts +++ b/packages/astro/src/server/middleware.ts @@ -3,6 +3,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, captureException, continueTrace, + flush, getActiveSpan, getClient, getCurrentScope, @@ -14,11 +15,14 @@ import { import type { Scope, SpanAttributes } from '@sentry/types'; import { addNonEnumerableProperty, + logger, objectify, stripUrlQueryAndFragment, + vercelWaitUntil, winterCGRequestToRequestData, } from '@sentry/utils'; import type { APIContext, MiddlewareResponseHandler } from 'astro'; +import { DEBUG_BUILD } from '../../debug-build'; type MiddlewareOptions = { /** @@ -188,6 +192,8 @@ async function instrumentRequest( } catch (e) { sendErrorToSentry(e); throw e; + } finally { + vercelWaitUntil(flushSafelyWithTimeout()); } // TODO: flush if serverless (first extract function) }, @@ -213,6 +219,19 @@ function addMetaTagToHead(htmlChunk: string): string { return htmlChunk.replace('', content); } +/** + * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections. + */ +export async function flushSafelyWithTimeout(): Promise { + try { + DEBUG_BUILD && logger.log('Flushing events...'); + await flush(2000); + DEBUG_BUILD && logger.log('Done flushing events'); + } catch (e) { + DEBUG_BUILD && logger.log('Error while flushing events:\n', e); + } +} + /** * Interpolates the route from the URL and the passed params. * Best we can do to get a route name instead of a raw URL. From 005a1c1eed763ef02ccd271ba47e2248bdcea8d4 Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 24 Oct 2024 15:27:34 +0200 Subject: [PATCH 04/31] inline flush --- packages/astro/src/server/middleware.ts | 26 ++++++++++++------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/astro/src/server/middleware.ts b/packages/astro/src/server/middleware.ts index 770162c61621..dedb0199f149 100644 --- a/packages/astro/src/server/middleware.ts +++ b/packages/astro/src/server/middleware.ts @@ -193,7 +193,18 @@ async function instrumentRequest( sendErrorToSentry(e); throw e; } finally { - vercelWaitUntil(flushSafelyWithTimeout()); + vercelWaitUntil( + (async () => { + // Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections. + try { + DEBUG_BUILD && logger.log('Flushing events...'); + await flush(2000); + DEBUG_BUILD && logger.log('Done flushing events'); + } catch (e) { + DEBUG_BUILD && logger.log('Error while flushing events:\n', e); + } + })(), + ); } // TODO: flush if serverless (first extract function) }, @@ -219,19 +230,6 @@ function addMetaTagToHead(htmlChunk: string): string { return htmlChunk.replace('', content); } -/** - * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections. - */ -export async function flushSafelyWithTimeout(): Promise { - try { - DEBUG_BUILD && logger.log('Flushing events...'); - await flush(2000); - DEBUG_BUILD && logger.log('Done flushing events'); - } catch (e) { - DEBUG_BUILD && logger.log('Error while flushing events:\n', e); - } -} - /** * Interpolates the route from the URL and the passed params. * Best we can do to get a route name instead of a raw URL. From 7781e04970e815f7990c80472fb53480cab00702 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 31 Oct 2024 10:07:17 +0100 Subject: [PATCH 05/31] chore(dev-deps): Update ember dev deps (#14119) We test lower versions in e2e tests, so we can bump to reasonably newer versions where possible in the package itself. --- packages/ember/config/ember-try.js | 62 - packages/ember/package.json | 33 +- packages/ember/tests/helpers/setup-sentry.ts | 2 +- .../unit/instrument-route-performance-test.ts | 3 +- yarn.lock | 1300 ++++++++--------- 5 files changed, 619 insertions(+), 781 deletions(-) delete mode 100644 packages/ember/config/ember-try.js diff --git a/packages/ember/config/ember-try.js b/packages/ember/config/ember-try.js deleted file mode 100644 index 3eb28d293e6e..000000000000 --- a/packages/ember/config/ember-try.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict'; - -const getChannelURL = require('ember-source-channel-url'); -const { embroiderOptimized } = require('@embroider/test-setup'); - -/** - * Pick which versions of ember against which to test based on whether the tests are running locally, as part of a PR, - * or when merging to `master` or creating a release. - * - * @returns The versions which should be tested, along with their respective config - */ -module.exports = async function () { - // whenever and wherever we test, we want to at least test against the latest version of ember - let scenarios = [ - { - name: 'ember-release', - npm: { - devDependencies: { - 'ember-source': await getChannelURL('release'), - }, - }, - }, - { - name: 'ember-4.0', - npm: { - devDependencies: { - 'ember-source': '~4.0.1', - }, - }, - }, - embroiderOptimized(), - { - name: 'ember-beta', - npm: { - devDependencies: { - 'ember-source': await getChannelURL('beta'), - }, - }, - allowedToFail: true, - }, - { - name: 'ember-classic', - env: { - EMBER_OPTIONAL_FEATURES: JSON.stringify({ - 'application-template-wrapper': true, - 'default-async-observers': false, - 'template-only-glimmer-components': false, - }), - }, - npm: { - ember: { - edition: 'classic', - }, - }, - }, - ]; - - return { - useYarn: true, - scenarios, - }; -}; diff --git a/packages/ember/package.json b/packages/ember/package.json index e27210b599c4..837467a69e58 100644 --- a/packages/ember/package.json +++ b/packages/ember/package.json @@ -25,8 +25,7 @@ "lint:ts": "tsc", "fix": "eslint . --format stylish --fix", "start": "ember serve", - "test": "ember b --prod && yarn ember test", - "test:all": "ember try:each", + "test": "ember b --prod && ember test", "prepack": "ember ts:precompile", "postpack": "ember ts:clean" }, @@ -44,42 +43,34 @@ }, "devDependencies": { "@ember/optional-features": "~1.3.0", - "@ember/test-helpers": "2.9.4", + "@ember/test-helpers": "4.0.4", "@embroider/test-setup": "~4.0.0", "@glimmer/component": "~1.1.2", "@glimmer/tracking": "~1.1.2", "@types/ember": "~3.16.5", - "@types/ember-qunit": "~3.4.9", "@types/ember-resolver": "5.0.13", "@types/ember__debug": "^3.16.5", - "@types/qunit": "~2.9.1", + "@types/qunit": "~2.19.11", "@types/rsvp": "~4.0.3", "babel-eslint": "~10.1.0", "broccoli-asset-rev": "~3.0.0", - "ember-cli": "~4.8.0", - "ember-cli-dependency-checker": "~3.3.1", + "ember-cli": "~4.12.3", + "ember-cli-dependency-checker": "~3.3.2", "ember-cli-inject-live-reload": "~2.1.0", - "ember-cli-sri": "~2.1.1", "ember-cli-terser": "~4.0.2", - "ember-cli-typescript-blueprints": "~3.0.0", - "ember-disable-prototype-extensions": "~1.1.3", "ember-load-initializers": "~2.1.1", - "ember-maybe-import-regenerator": "1.0.0", - "ember-qunit": "~6.0.0", - "ember-resolver": "11.0.0", - "ember-sinon-qunit": "7.1.4", - "ember-source": "~4.8.0", - "ember-source-channel-url": "~2.0.1", + "ember-qunit": "~8.1.0", + "ember-resolver": "13.0.2", + "ember-sinon-qunit": "7.5.0", + "ember-source": "~4.12.4", "ember-template-lint": "~4.16.1", - "ember-try": "~2.0.0", - "ember-window-mock": "~0.8.1", "eslint-plugin-ember": "11.9.0", "eslint-plugin-n": "16.0.1", "eslint-plugin-qunit": "8.0.0", "loader.js": "~4.7.0", - "qunit": "~2.19.2", - "qunit-dom": "~2.0.0", - "sinon": "15.2.0", + "qunit": "~2.22.0", + "qunit-dom": "~3.2.1", + "sinon": "19.0.2", "webpack": "~5.95.0" }, "engines": { diff --git a/packages/ember/tests/helpers/setup-sentry.ts b/packages/ember/tests/helpers/setup-sentry.ts index a194d67fc662..1c4de83681e6 100644 --- a/packages/ember/tests/helpers/setup-sentry.ts +++ b/packages/ember/tests/helpers/setup-sentry.ts @@ -37,7 +37,7 @@ export function setupSentryTest(hooks: NestedHooks): void { return true; }; - setupOnerror(function (error) { + setupOnerror(function (error: Error) { errorMessages.push(error.message); throw error; }); diff --git a/packages/ember/tests/unit/instrument-route-performance-test.ts b/packages/ember/tests/unit/instrument-route-performance-test.ts index f35da9f6bba2..753bf9669548 100644 --- a/packages/ember/tests/unit/instrument-route-performance-test.ts +++ b/packages/ember/tests/unit/instrument-route-performance-test.ts @@ -4,13 +4,14 @@ import { setupTest } from 'ember-qunit'; import { module, test } from 'qunit'; import sinon from 'sinon'; +import type { SentryTestContext } from '../helpers/setup-sentry'; import { setupSentryTest } from '../helpers/setup-sentry'; module('Unit | Utility | instrument-route-performance', function (hooks) { setupTest(hooks); setupSentryTest(hooks); - test('wrapped Route hooks maintain the current context', function (assert) { + test('wrapped Route hooks maintain the current context', function (this: SentryTestContext, assert) { const beforeModel = sinon.spy(); const model = sinon.spy(); const afterModel = sinon.spy(); diff --git a/yarn.lock b/yarn.lock index d2dedd157477..0576ce8c71fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1120,6 +1120,15 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.0.tgz#9374b5cd068d128dac0b94ff482594273b1c2815" + integrity sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.4", "@babel/compat-data@^7.20.0": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" @@ -1160,6 +1169,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== +"@babel/compat-data@^7.25.9": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.0.tgz#f02ba6d34e88fadd5e8861e8b38902f43cc1c819" + integrity sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA== + "@babel/core@7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" @@ -1181,7 +1195,7 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.16.10", "@babel/core@^7.16.7", "@babel/core@^7.17.5", "@babel/core@^7.18.13", "@babel/core@^7.3.4", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/core@^7.1.0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.16.10", "@babel/core@^7.16.7", "@babel/core@^7.17.5", "@babel/core@^7.3.4", "@babel/core@^7.7.2", "@babel/core@^7.8.0": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== @@ -1244,6 +1258,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.21.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.22.10": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" @@ -1406,6 +1441,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.0.tgz#505cc7c90d92513f458a477e5ef0703e7c91b8d7" + integrity sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w== + dependencies: + "@babel/parser" "^7.26.0" + "@babel/types" "^7.26.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@7.18.6", "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -1507,6 +1553,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0", "@babel/helper-create-class-features-plugin@^7.5.5": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" @@ -1745,6 +1802,14 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" @@ -1802,6 +1867,15 @@ "@babel/helper-validator-identifier" "^7.24.7" "@babel/traverse" "^7.25.2" +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" @@ -1853,6 +1927,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== +"@babel/helper-plugin-utils@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" @@ -2005,6 +2084,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" @@ -2020,6 +2104,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" @@ -2045,6 +2134,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + "@babel/helper-wrap-function@^7.18.9": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" @@ -2125,6 +2219,14 @@ "@babel/template" "^7.25.0" "@babel/types" "^7.25.6" +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -2234,6 +2336,13 @@ dependencies: "@babel/types" "^7.25.6" +"@babel/parser@^7.25.9", "@babel/parser@^7.26.0": + version "7.26.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.1.tgz#44e02499960df2cdce2c456372a3e8e0c3c5c975" + integrity sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw== + dependencies: + "@babel/types" "^7.26.0" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" @@ -2521,6 +2630,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@babel/plugin-syntax-decorators@^7.23.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz#986b4ca8b7b5df3f67cee889cedeffc2e2bf14b3" + integrity sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-decorators@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" @@ -2746,19 +2862,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.16.0", "@babel/plugin-transform-block-scoping@^7.19.4": +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" + integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-block-scoping@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz#315d70f68ce64426db379a3d830e7ac30be02e9b" integrity sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-block-scoping@^7.18.9": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" - integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== +"@babel/plugin-transform-block-scoping@^7.20.5": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-block-scoping@^7.24.4": version "7.24.4" @@ -3802,6 +3925,15 @@ "@babel/parser" "^7.25.0" "@babel/types" "^7.25.0" +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/traverse@^7.13.0", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.22.10", "@babel/traverse@^7.23.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" @@ -3879,6 +4011,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@7.20.7", "@babel/types@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -3951,6 +4096,14 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -4043,11 +4196,6 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - "@cspotcode/source-map-support@0.8.1", "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -4209,31 +4357,39 @@ silent-error "^1.1.1" util.promisify "^1.0.0" -"@ember/test-helpers@2.9.4": - version "2.9.4" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-2.9.4.tgz#985022e9ba05cfc918bcf08b77cbb355f85b723e" - integrity sha512-z+Qs1NYWyIVDmrY6WdmOS5mdG1lJ5CFfzh6dRhLfs9lq45deDaDrVNcaCYhnNeJZTvUBK2XR2SvPcZm0RloXdA== +"@ember/test-helpers@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-4.0.4.tgz#2ffb55c8438b8ba54ecd4f546059ba0166bc00f2" + integrity sha512-1mbOVyVEcLxYOGzBaeeaQkCrL1o9Av86QaHk/1RvrVBW24I6YUj1ILLEi2qLZT5PzcCy0TdfadHT3hKJwJ0GcQ== dependencies: - "@ember/test-waiters" "^3.0.0" - "@embroider/macros" "^1.10.0" - "@embroider/util" "^1.9.0" - broccoli-debug "^0.6.5" - broccoli-funnel "^3.0.8" - ember-cli-babel "^7.26.11" - ember-cli-htmlbars "^6.1.1" - ember-destroyable-polyfill "^2.0.3" + "@ember/test-waiters" "^3.1.0" + "@embroider/addon-shim" "^1.8.7" + "@embroider/macros" "^1.16.5" + "@simple-dom/interface" "^1.4.0" + decorator-transforms "^2.0.0" + dom-element-descriptors "^0.5.0" -"@ember/test-waiters@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-3.0.2.tgz#5b950c580a1891ed1d4ee64f9c6bacf49a15ea6f" - integrity sha512-H8Q3Xy9rlqhDKnQpwt2pzAYDouww4TZIGSI1pZJhM7mQIGufQKuB0ijzn/yugA6Z+bNdjYp1HioP8Y4hn2zazQ== +"@ember/test-waiters@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@ember/test-waiters/-/test-waiters-3.1.0.tgz#61399919cbf793978da0b8bfdfdb7bca0cb80e9e" + integrity sha512-bb9h95ktG2wKY9+ja1sdsFBdOms2lB19VWs8wmNpzgHv1NCetonBoV5jHBV4DHt0uS1tg9z66cZqhUVlYs96KQ== dependencies: calculate-cache-key-for-tree "^2.0.0" ember-cli-babel "^7.26.6" ember-cli-version-checker "^5.1.2" semver "^7.3.5" -"@embroider/macros@^1.0.0", "@embroider/macros@^1.10.0", "@embroider/macros@^1.15.0", "@embroider/macros@^1.16.0": +"@embroider/addon-shim@^1.8.6", "@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/macros@^1.0.0", "@embroider/macros@^1.16.0": version "1.16.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.16.0.tgz#4d7ffe3496f6052a6f7abe2d1235be44c5f10720" integrity sha512-k36Zt+RPGZiMR6lFqrb/fJmMCCG7He0ww7O1w72eT/QVlvlJ2d7T1/0yvG+ZThHGpvX1FQMKQYJkREfG2DJF6w== @@ -4248,6 +4404,20 @@ resolve "^1.20.0" semver "^7.3.2" +"@embroider/macros@^1.13.1", "@embroider/macros@^1.16.5": + version "1.16.9" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.16.9.tgz#d1292105259f53f31a8bf0fde48cf972495f06d1" + integrity sha512-AUrmHQdixczIU3ouv/+HzWxwYVsw/NwssZxAQnXfBDJ3d3/CRtAvGRu3JhY6OT3AAPFwfa2WT66tB5jeAa7r5g== + dependencies: + "@embroider/shared-internals" "2.8.1" + assert-never "^1.2.1" + babel-import-util "^2.0.0" + ember-cli-babel "^7.26.6" + find-up "^5.0.0" + lodash "^4.17.21" + resolve "^1.20.0" + semver "^7.3.2" + "@embroider/shared-internals@2.6.0", "@embroider/shared-internals@^2.0.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-2.6.0.tgz#851fd8d051fd4f7f93b2b7130e2ae5cdd537c5d6" @@ -4264,6 +4434,24 @@ semver "^7.3.5" typescript-memoize "^1.0.1" +"@embroider/shared-internals@2.8.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/test-setup@~4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@embroider/test-setup/-/test-setup-4.0.0.tgz#080dd40314a53cc6f6fcffed41cd24ee0cb48b3d" @@ -4272,16 +4460,6 @@ lodash "^4.17.21" resolve "^1.20.0" -"@embroider/util@^1.9.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@embroider/util/-/util-1.13.0.tgz#075c0be2955505677e7fd834847b1e7b30b5e11a" - integrity sha512-29NeyZ8jvcQXCZThaARpbU9nBNMXj/5dCuQmFmxyEC2AcHFzBBhhL0ebv6VI2e3f44g+pAFbCMbN434VBh2xqQ== - dependencies: - "@babel/core" "^7.24.0" - "@embroider/macros" "^1.15.0" - broccoli-funnel "^3.0.5" - ember-cli-babel "^8.2.0" - "@esbuild-plugins/node-globals-polyfill@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" @@ -8308,11 +8486,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== - "@sindresorhus/merge-streams@^2.1.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" @@ -8325,26 +8498,19 @@ dependencies: type-detect "4.0.8" -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== +"@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@^10.0.2", "@sinonjs/fake-timers@^10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== +"@sinonjs/fake-timers@^13.0.1", "@sinonjs/fake-timers@^13.0.2": + version "13.0.4" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.4.tgz#cacb89257e650f3214f9da5d9236f72c9658a607" + integrity sha512-wpUq+QiKxrWk7U2pdvNSY9fNX62/k+7eEdlQMO0A3rU8tQ+vvzY/WzBhMz+GbQlATXZlXWYQqFWNFcn1SVvThA== dependencies: - "@sinonjs/commons" "^3.0.0" + "@sinonjs/commons" "^3.0.1" "@sinonjs/fake-timers@^8.0.1": version "8.1.0" @@ -8353,19 +8519,19 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/samsam@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" - integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== +"@sinonjs/samsam@^8.0.1": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" + integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.1" lodash.get "^4.4.2" - type-detect "^4.0.8" + type-detect "^4.1.0" -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@sinonjs/text-encoding@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f" + integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA== "@size-limit/file@~11.1.6": version "11.1.6" @@ -9238,15 +9404,6 @@ dependencies: "@types/node" "*" -"@types/ember-qunit@~3.4.9": - version "3.4.14" - resolved "https://registry.yarnpkg.com/@types/ember-qunit/-/ember-qunit-3.4.14.tgz#4c10ce71e1eb6618ef7c680616beff8358e9c486" - integrity sha512-gVjul0Gei69Ftstd8gOPbKvIs9ywmtdBkvOTxq1uXsFU2EiVUWBtIzP9bMT9CrD39nKnB/rFdRXAwFcSnPUNJg== - dependencies: - "@types/ember" "*" - "@types/ember-test-helpers" "*" - "@types/qunit" "*" - "@types/ember-resolver@5.0.13": version "5.0.13" resolved "https://registry.yarnpkg.com/@types/ember-resolver/-/ember-resolver-5.0.13.tgz#db66678076ca625ed80b629c09619ae85c1c1f7a" @@ -9255,17 +9412,7 @@ "@types/ember__object" "*" "@types/ember__owner" "*" -"@types/ember-test-helpers@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/ember-test-helpers/-/ember-test-helpers-1.0.9.tgz#4279c5f3b390f25fbfb3f9f210785d36a336b8a7" - integrity sha512-IJyyoUxMnK2fGCSSyvuZP9d7+wirJ0elH/joCPHzWQQyAq413oMJdWhxEMdIxLY+0Z0OsfuvTHIEcUSqjs0m0A== - dependencies: - "@types/ember" "*" - "@types/htmlbars-inline-precompile" "*" - "@types/jquery" "*" - "@types/rsvp" "*" - -"@types/ember@*", "@types/ember@~3.16.5": +"@types/ember@~3.16.5": version "3.16.5" resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.16.5.tgz#c2d6b0f178761c0c2fbc6fc39b4b6958c256d0ac" integrity sha512-8BzT1g8r7xQsN2p7qIUZ0AXWEVpJ5LmaRWP3iT79PLyIQfTAYvHSueUl14lrB8renETjwr4+ZvVPKurn9TKxNA== @@ -9880,15 +10027,10 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== -"@types/qunit@*": - version "2.11.1" - resolved "https://registry.yarnpkg.com/@types/qunit/-/qunit-2.11.1.tgz#3496d430d2bb0fa4761f00a27511f46020c6b410" - integrity sha512-vcM5+9O8LZuu5DYseaV4J7ehkYrhkv+aMIuxnF/OqMYlVEdv+odpCH1/5OVztiqxbCqTpQKWuELkMvG7OPycUQ== - -"@types/qunit@~2.9.1": - version "2.9.6" - resolved "https://registry.yarnpkg.com/@types/qunit/-/qunit-2.9.6.tgz#5d6ba092920edf9dc7377f5091e36eb448743a02" - integrity sha512-FfKb3sBW9sdjj8mPzAXtsKn53sOHpzi4PZj0H7P5G24VruwaOmvi0L2kJpuYARQjOKRl/YVlZQ6JWPnspWOkZA== +"@types/qunit@~2.19.11": + version "2.19.11" + resolved "https://registry.yarnpkg.com/@types/qunit/-/qunit-2.19.11.tgz#64fed1de913b8f25ea398565be9a2d6254276c54" + integrity sha512-JYIrHO/FFMJ8t6zcw5O8Id6ctKyBaYFZOQI9D6pXOI9TwSF+tkvPZAouo6RtvjvZCBBVNBcxf1lqKWMmUH1yaA== "@types/range-parser@*": version "1.2.3" @@ -10034,10 +10176,10 @@ resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded" integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg== -"@types/sinon@^10.0.13": - version "10.0.16" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.16.tgz#4bf10313bd9aa8eef1e50ec9f4decd3dd455b4d3" - integrity sha512-j2Du5SYpXZjJVJtXBokASpPRj+e2z+VUhCPHmM6WMfe3dpHu6iVKJMU6AiBcMp/XTAYnEj6Wc1trJUWwZ0QaAQ== +"@types/sinon@^17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.3.tgz#9aa7e62f0a323b9ead177ed23a36ea757141a5fa" + integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw== dependencies: "@types/sinonjs__fake-timers" "*" @@ -12168,6 +12310,11 @@ babel-import-util@^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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-3.0.0.tgz#5814c6a58e7b80e64156b48fdfd34d48e6e0b1df" + integrity sha512-4YNPkuVsxAW5lnSTa6cn4Wk49RX6GAB6vX+M6LqEtN0YePqoFczv1/x0EyLK/o+4E1j9jEuYj5Su7IEPab5JHQ== + babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" @@ -12522,6 +12669,13 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +better-path-resolve@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" + integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== + dependencies: + is-windows "^1.0.0" + big-integer@^1.6.44: version "1.6.52" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" @@ -12828,18 +12982,6 @@ broccoli-builder@^0.18.14: rsvp "^3.0.17" silent-error "^1.0.1" -broccoli-caching-writer@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz#b93cf58f9264f003075868db05774f4e7f25bd07" - integrity sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc= - dependencies: - broccoli-kitchen-sink-helpers "^0.2.5" - broccoli-plugin "1.1.0" - debug "^2.1.1" - rimraf "^2.2.8" - rsvp "^3.0.17" - walk-sync "^0.2.5" - broccoli-caching-writer@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz#0bd2c96a9738d6a6ab590f07ba35c5157d7db476" @@ -12955,7 +13097,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^3.0.3, broccoli-funnel@^3.0.5, broccoli-funnel@^3.0.8: +broccoli-funnel@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== @@ -12968,14 +13110,6 @@ broccoli-funnel@^3.0.3, broccoli-funnel@^3.0.5, broccoli-funnel@^3.0.8: minimatch "^3.0.0" walk-sync "^2.0.2" -broccoli-kitchen-sink-helpers@^0.2.5: - version "0.2.9" - resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" - integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= - dependencies: - glob "^5.0.10" - mkdirp "^0.5.1" - broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" @@ -12984,7 +13118,7 @@ broccoli-kitchen-sink-helpers@^0.3.1: glob "^5.0.10" mkdirp "^0.5.1" -broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: +broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A== @@ -13107,16 +13241,6 @@ broccoli-persistent-filter@^3.1.2: symlink-or-copy "^1.0.1" sync-disk-cache "^2.0.0" -broccoli-plugin@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" - integrity sha1-c+LPoF+OoeP8FCDEDD2efcckvwI= - dependencies: - promise-map-series "^0.2.1" - quick-temp "^0.1.3" - rimraf "^2.3.4" - symlink-or-copy "^1.0.1" - broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" @@ -13169,17 +13293,6 @@ broccoli-source@^3.0.0, broccoli-source@^3.0.1: dependencies: broccoli-node-api "^1.6.0" -broccoli-sri-hash@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" - integrity sha1-vGmQXtejga0yXMDQLe0HEyjr8/M= - dependencies: - broccoli-caching-writer "^2.2.0" - mkdirp "^0.5.1" - rsvp "^3.1.0" - sri-toolbox "^0.2.0" - symlink-or-copy "^1.0.1" - broccoli-stew@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-3.0.0.tgz#fd1d19d162ad9490b42e5c563b78c26eb1e80b95" @@ -13301,6 +13414,16 @@ browserslist@^4.23.3: node-releases "^2.0.18" update-browserslist-db "^1.1.0" +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + dependencies: + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -13563,19 +13686,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -13674,20 +13784,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629: - version "1.0.30001636" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" - integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== - -caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001541, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001591: - version "1.0.30001614" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz#f894b4209376a0bf923d67d9c361d96b1dfebe39" - integrity sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog== - -caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: - version "1.0.30001664" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" - integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001541, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001591, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663, caniuse-lite@^1.0.30001669: + version "1.0.30001674" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001674.tgz#eb200a716c3e796d33d30b9c8890517a72f862c8" + integrity sha512-jOsKlZVRnzfhLojb+Ykb+gyUSp9Xb57So+fAiFlLzzTKpqg8xxSav0e40c8/4F/v9N8QSvrRRaLeVzQbLqomYw== capnp-ts@^0.7.0: version "0.7.0" @@ -13730,7 +13830,7 @@ chai@^4.3.10: pathval "^1.1.1" type-detect "^4.0.8" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -13877,7 +13977,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0, ci-info@^3.3.2, ci-info@^3.4.0: +ci-info@^3.2.0, ci-info@^3.4.0: version "3.5.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== @@ -13887,7 +13987,7 @@ ci-info@^3.6.1: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== -ci-info@^3.8.0: +ci-info@^3.7.0, ci-info@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -14018,15 +14118,6 @@ cli-spinners@^2.9.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== -cli-table3@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - cli-table@^0.3.1: version "0.3.6" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.6.tgz#e9d6aa859c7fe636981fd3787378c2a20bce92fc" @@ -14085,7 +14176,7 @@ clone-deep@4.0.1, clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@1.0.2, clone-response@^1.0.2: +clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== @@ -14283,11 +14374,6 @@ common-ancestor-path@^1.0.1: resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== -common-tags@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" - integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -15241,6 +15327,14 @@ 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" + dedent@0.7.0, dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -15685,6 +15779,11 @@ 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-serializer@^1.0.1: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" @@ -15911,14 +16010,21 @@ electron-to-chromium@^1.5.28: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== -ember-auto-import@^2.4.1, ember-auto-import@^2.4.2, ember-auto-import@^2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.6.3.tgz#f18d1b93dd10b08ba5496518436f9d56dd4e000a" - integrity sha512-uLhrRDJYWCRvQ4JQ1e64XlSrqAKSd6PXaJ9ZsZI6Tlms9T4DtQFxNXasqji2ZRJBVrxEoLCRYX3RTldsQ0vNGQ== +electron-to-chromium@^1.5.41: + version "1.5.49" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz#9358f514ab6eeed809a8689f4b39ea5114ae729c" + integrity sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A== + +ember-auto-import@^2.5.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.8.1.tgz#03977e87ce178e6f9e4f89809185ff8f0fee9fcb" + integrity sha512-R5RpJmhycU6YKryzsIL/wP42r0e2PPfLRsFECoGvb1st2eEnU1Q7XyLVC1txd/XvURfu7x3Z7hKtZtYUxy61oQ== dependencies: "@babel/core" "^7.16.7" "@babel/plugin-proposal-class-properties" "^7.16.7" "@babel/plugin-proposal-decorators" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.7" + "@babel/plugin-transform-class-static-block" "^7.16.7" "@babel/preset-env" "^7.16.7" "@embroider/macros" "^1.0.0" "@embroider/shared-internals" "^2.0.0" @@ -15937,10 +16043,13 @@ ember-auto-import@^2.4.1, ember-auto-import@^2.4.2, ember-auto-import@^2.6.1: fs-extra "^10.0.0" fs-tree-diff "^2.0.0" handlebars "^4.3.1" + is-subdir "^1.2.0" js-string-escape "^1.0.1" lodash "^4.17.19" mini-css-extract-plugin "^2.5.2" + minimatch "^3.0.0" parse5 "^6.0.1" + pkg-entry-points "^1.1.0" resolve "^1.20.0" resolve-package-path "^4.0.3" semver "^7.3.4" @@ -15993,7 +16102,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.1: resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@^7.0.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.11, ember-cli-babel@^7.26.6, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.13.0, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.11, ember-cli-babel@^7.26.6, ember-cli-babel@^7.7.3: version "7.26.11" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.11.tgz#50da0fe4dcd99aada499843940fec75076249a9f" integrity sha512-JJYeYjiz/JTn34q7F5DSOjkkZqy8qwFOOxXfE6pe9yEJqWGu4qErKxlz8I22JoVEQ/aBUO+OcKTpmctvykM9YA== @@ -16062,23 +16171,23 @@ ember-cli-babel@^8.2.0: resolve-package-path "^4.0.3" semver "^7.3.8" -ember-cli-dependency-checker@~3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.3.1.tgz#16b44d7a1a1e946f59859fad97f32e616d78323a" - integrity sha512-Tg6OeijjXNKWkDm6057Tr0N9j9Vlz/ITewXWpn1A/+Wbt3EowBx5ZKfvoupqz05EznKgL1B/ecG0t+JN7Qm6MA== +ember-cli-dependency-checker@~3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.3.2.tgz#94ed7e8e3d47e494082eb9ccfaa489d603ab6017" + integrity sha512-PwkrW5oYsdPWwt+0Tojufmv/hxVETTjkrEdK7ANQB2VSnqpA5UcYubwpQM9ONuR2J8wyNDMwEHlqIrk/FYtBsQ== dependencies: - chalk "^2.3.0" - find-yarn-workspace-root "^1.1.0" + chalk "^2.4.2" + find-yarn-workspace-root "^1.2.1" is-git-url "^1.0.0" - resolve "^1.5.0" - semver "^5.3.0" + resolve "^1.22.0" + semver "^5.7.1" ember-cli-get-component-path-option@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771" integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E= -ember-cli-htmlbars@^6.0.1, ember-cli-htmlbars@^6.1.1: +ember-cli-htmlbars@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-6.1.1.tgz#f5b588572a5d18ad087560122b8dabc90145173d" integrity sha512-DKf2rjzIVw9zWCuFsBGJScrgf5Mz7dSg08Cq+FWFYIxnpssINUbNUoB0NHWnUJK4QqCvaExOyOmjm0kO455CPg== @@ -16138,14 +16247,7 @@ ember-cli-preprocess-registry@^3.3.0: debug "^3.0.1" process-relative-require "^1.0.0" -ember-cli-sri@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" - integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= - dependencies: - broccoli-sri-hash "^2.1.0" - -ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: +ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= @@ -16157,19 +16259,12 @@ ember-cli-terser@~4.0.2: dependencies: broccoli-terser-sourcemap "^4.1.0" -ember-cli-test-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" - integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= - dependencies: - ember-cli-string-utils "^1.0.0" - -ember-cli-test-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-3.0.0.tgz#1c036fc48de36155355fcda3266af63f977826f1" - integrity sha512-wfFRBrfO9gaKScYcdQxTfklx9yp1lWK6zv1rZRpkas9z2SHyJojF7NOQRWQgSB3ypm7vfpiF8VsFFVVr7VBzAQ== +ember-cli-test-loader@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-3.1.0.tgz#13abd43b7e07e2266a9f0fc5b9dc5455883b18ff" + integrity sha512-0aocZV9SIoOHiU3hrH3IuLR6busWhTX6UVXgd490hmJkIymmOXNH2+jJoC7Ebkeo3PiOfAdjqhb765QDlHSJOw== dependencies: - ember-cli-babel "^7.13.2" + ember-cli-babel "^7.23.0" ember-cli-typescript-blueprint-polyfill@^0.1.0: version "0.1.0" @@ -16179,27 +16274,6 @@ ember-cli-typescript-blueprint-polyfill@^0.1.0: chalk "^4.0.0" remove-types "^1.0.0" -ember-cli-typescript-blueprints@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-typescript-blueprints/-/ember-cli-typescript-blueprints-3.0.0.tgz#88595df71ddca9a7cb3ef1fb1626a1c2528da1b6" - integrity sha512-nJScjIjwDY96q9eiIBse9npLht/1FNmDRMpoTLJUrgSTzmx7/S6JhlH4BrMELkLCvtPkWoduDNBGiGBdCqf9FA== - dependencies: - chalk "^2.4.1" - ember-cli-babel "^7.0.0" - ember-cli-get-component-path-option "^1.0.0" - ember-cli-is-package-missing "^1.0.0" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-valid-component-name "^1.0.0" - ember-cli-version-checker "^3.0.0" - ember-router-generator "^2.0.0" - exists-sync "^0.1.0" - fs-extra "^8.0.0" - inflection "^1.12.0" - silent-error "^1.1.0" - ember-cli-typescript@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.0.0.tgz#3b838d1ce9e4d22a98e68da22ceac6dc0cfd9bfc" @@ -16235,22 +16309,6 @@ ember-cli-typescript@^2.0.2: stagehand "^1.0.0" walk-sync "^1.0.0" -ember-cli-typescript@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-5.2.1.tgz#553030f1ce3e8958b8e4fc34909acd1218cb35f2" - integrity sha512-qqp5TAIuPHxHiGXJKL+78Euyhy0zSKQMovPh8sJpN/ZBYx0H90pONufHR3anaMcp1snVfx4B+mb9+7ijOik8ZA== - dependencies: - ansi-to-html "^0.6.15" - broccoli-stew "^3.0.0" - debug "^4.0.0" - execa "^4.0.0" - fs-extra "^9.0.1" - resolve "^1.5.0" - rsvp "^4.8.1" - semver "^7.3.2" - stagehand "^1.0.0" - walk-sync "^2.2.0" - ember-cli-typescript@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-5.3.0.tgz#c0f726c61e4309aa9ff49b388219c6729ea986cd" @@ -16267,14 +16325,7 @@ ember-cli-typescript@^5.3.0: stagehand "^1.0.0" walk-sync "^2.2.0" -ember-cli-valid-component-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" - integrity sha1-cVUM44fgIzBl8wswsVEKot++h+8= - dependencies: - silent-error "^1.0.0" - -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -16300,13 +16351,13 @@ ember-cli-version-checker@^5.1.1, ember-cli-version-checker@^5.1.2: semver "^7.3.4" silent-error "^1.1.1" -ember-cli@~4.8.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-4.8.0.tgz#71988bdad50661b904f7121a566799027c07ba72" - integrity sha512-NiLCOd+/ckgJvH/DzV5aWUPfGHm3LomktonXQVsFkdbfs4YF/+RHBkqwGuEH73RcOLmTRDj6YWVMOTDjWvXT/Q== +ember-cli@~4.12.3: + version "4.12.3" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-4.12.3.tgz#a8c3f0e62ed1c595fd2348eca82a3a068c6bf001" + integrity sha512-Ilap7fVGx0+sF6y5O1id+xVPYlc2cJ8OAG6faEQPyvbaCCUsCZnAEr7EMA+5qg0kNqjawIIHJTgnQesdbaDwtg== dependencies: - "@babel/core" "^7.18.13" - "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/core" "^7.21.0" + "@babel/plugin-transform-modules-amd" "^7.20.11" amd-name-resolver "^1.3.1" babel-plugin-module-resolver "^4.1.0" bower-config "^1.4.3" @@ -16329,7 +16380,7 @@ ember-cli@~4.8.0: calculate-cache-key-for-tree "^2.0.0" capture-exit "^2.0.0" chalk "^4.1.2" - ci-info "^3.3.2" + ci-info "^3.7.0" clean-base-url "^1.0.0" compression "^1.7.4" configstore "^5.0.1" @@ -16342,63 +16393,64 @@ ember-cli@~4.8.0: ember-cli-normalize-entity-name "^1.0.0" ember-cli-preprocess-registry "^3.3.0" ember-cli-string-utils "^1.1.0" - ember-source-channel-url "^3.0.0" ensure-posix-path "^1.1.1" execa "^5.1.1" exit "^0.1.2" express "^4.18.1" - filesize "^9.0.11" + filesize "^10.0.5" find-up "^5.0.0" find-yarn-workspace-root "^2.0.0" fixturify-project "^2.1.1" - fs-extra "^10.1.0" + fs-extra "^11.1.0" fs-tree-diff "^2.0.1" get-caller-file "^2.0.5" git-repo-info "^2.1.1" - glob "^7.2.0" + glob "^8.1.0" heimdalljs "^0.2.6" heimdalljs-fs-monitor "^1.1.1" heimdalljs-graph "^1.0.0" heimdalljs-logger "^0.1.10" http-proxy "^1.18.1" - inflection "^1.13.1" + inflection "^2.0.1" + inquirer "^8.2.1" is-git-url "^1.0.0" is-language-code "^3.1.0" isbinaryfile "^5.0.0" js-yaml "^4.1.0" leek "0.0.24" - lodash.template "^4.5.0" + lodash "^4.17.21" markdown-it "^13.0.1" - markdown-it-terminal "0.2.1" - minimatch "^5.1.0" + markdown-it-terminal "^0.4.0" + minimatch "^7.4.1" morgan "^1.10.0" nopt "^3.0.6" - npm-package-arg "^9.1.0" + npm-package-arg "^10.1.0" + os-locale "^5.0.0" p-defer "^3.0.0" - portfinder "^1.0.29" + portfinder "^1.0.32" promise-map-series "^0.3.0" promise.hash.helper "^1.0.8" quick-temp "^0.1.8" remove-types "^1.0.0" resolve "^1.22.1" resolve-package-path "^4.0.3" - safe-stable-stringify "^2.3.1" + safe-stable-stringify "^2.4.2" sane "^5.0.1" semver "^7.3.5" silent-error "^1.1.1" sort-package-json "^1.57.0" symlink-or-copy "^1.3.1" temp "0.9.4" - testem "^3.8.0" + testem "^3.10.1" tiny-lr "^2.0.0" tree-sync "^2.1.0" - uuid "^8.3.2" + uuid "^9.0.0" walk-sync "^3.0.0" watch-detector "^1.0.2" - workerpool "^6.2.1" + workerpool "^6.4.0" yam "^1.0.0" -ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.1: +ember-compatibility-helpers@^1.1.2: version "1.2.6" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.6.tgz#603579ab2fb14be567ef944da3fc2d355f779cd8" integrity sha512-2UBUa5SAuPg8/kRVaiOfTwlXdeVweal1zdNPibwItrhR0IvPrXpaqwJDlEZnWKEoB+h33V0JIfiWleSG6hGkkA== @@ -16409,20 +16461,6 @@ ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.1: fs-extra "^9.1.0" semver "^5.4.1" -ember-destroyable-polyfill@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.3.tgz#1673ed66609a82268ef270a7d917ebd3647f11e1" - integrity sha512-TovtNqCumzyAiW0/OisSkkVK93xnVF4NRU6+FN0ubpfwEOpRrmM2RqDwXI6YAChCgSHON1cz0DfQStpA1Gjuuw== - dependencies: - ember-cli-babel "^7.22.1" - ember-cli-version-checker "^5.1.1" - ember-compatibility-helpers "^1.2.1" - -ember-disable-prototype-extensions@~1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" - integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= - ember-load-initializers@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.2.tgz#8a47a656c1f64f9b10cecdb4e22a9d52ad9c7efa" @@ -16431,35 +16469,20 @@ ember-load-initializers@~2.1.1: ember-cli-babel "^7.13.0" ember-cli-typescript "^2.0.2" -ember-maybe-import-regenerator@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-1.0.0.tgz#c05453dfd3b65dbec2b569612b01ae70b672dd7e" - integrity sha512-wtjgjEV0Hk4fgiAwFjOfPrGWfmFrbRW3zgNZO4oA3H5FlbMssMvWuR8blQ3QSWYHODVK9r+ThsRAs8lG4kbxqA== - dependencies: - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - ember-cli-babel "^7.26.6" - regenerator-runtime "^0.13.2" - -ember-qunit@~6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-6.0.0.tgz#cea4766c297a25d58a3e886ccd4eb726167ea47c" - integrity sha512-idNWh9Ap2HN9e3Xozh5Jrciu5tDhn0okM/bgwDjdks3dwuMhEox45iiRTx469FWQ9+ixjZ40AsXsRTDkfCmvmw== +ember-qunit@~8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-8.1.0.tgz#c9dcd5bc97d3b122db7e416e3aef09fba7db39f9" + integrity sha512-55/xqvVQwhiNcnh/tCzWyvlYzrYqwDY0/cIPyDQbAxGKtkUt9jCfRUGllfyOofC6LX0fL/0fIi+5e9sg1m6vXw== dependencies: - broccoli-funnel "^3.0.8" - broccoli-merge-trees "^3.0.2" - common-tags "^1.8.0" - ember-auto-import "^2.4.2" - ember-cli-babel "^7.26.6" - ember-cli-test-loader "^3.0.0" - resolve-package-path "^4.0.3" - silent-error "^1.1.1" - validate-peer-dependencies "^2.1.0" + "@embroider/addon-shim" "^1.8.6" + "@embroider/macros" "^1.13.1" + ember-cli-test-loader "^3.1.0" + qunit-theme-ember "^1.0.0" -ember-resolver@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-11.0.0.tgz#a2b6b8459a63d01fca4ff36386a743b630f39d22" - integrity sha512-TOc685OnGEMMNEt04BukmQHOYVXnRJc+sGZij/vzWdxXRq+Wpsu1Nw2nLFo6fbMqqVLATk5oLKAQ1eKQwte2wQ== +ember-resolver@13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-13.0.2.tgz#c50269b35b0faef6b95d959e45768fab0536149c" + integrity sha512-9G8CVjjI4Q6vx2+FYg8YeLu+/fP4eBL/1+qp5bzwtXQ7G3xkg0YRpcufIdsBjf5K2SUStU83qhNH2O6aanf3nw== dependencies: ember-cli-babel "^7.26.11" @@ -16477,40 +16500,25 @@ ember-router-generator@^2.0.0: "@babel/traverse" "^7.4.5" recast "^0.18.1" -ember-sinon-qunit@7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/ember-sinon-qunit/-/ember-sinon-qunit-7.1.4.tgz#52c87bb81be6391931481e11e32b54209fcd3eae" - integrity sha512-aV9jOaLR5W4sFsx0hVqHVVdPt/TxY537YeuwMNyeOgxWYmLLFek7Jo4KMs/m442OsFlP0uCT52r7YOeBXBuEiA== - dependencies: - "@types/sinon" "^10.0.13" - broccoli-funnel "^3.0.8" - ember-auto-import "^2.6.1" - ember-cli-babel "^7.26.11" - ember-cli-typescript "^5.2.1" - -ember-source-channel-url@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-3.0.0.tgz#bcd5be72c63fa0b8c390b3121783b462063e2a1b" - integrity sha512-vF/8BraOc66ZxIDo3VuNP7iiDrnXEINclJgSJmqwAAEpg84Zb1DHPI22XTXSDA+E8fW5btPUxu65c3ZXi8AQFA== - dependencies: - node-fetch "^2.6.0" - -ember-source-channel-url@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-2.0.1.tgz#18b88f8a00b7746e7a456b3551abb3aea18729cc" - integrity sha512-YlLUHW9gNvxEaohIj5exykoTZb4xj9ZRTcR4J3svv9S8rjAHJUnHmqC5Fd9onCs+NGxHo7KwR/fDwsfadbDu5Q== +ember-sinon-qunit@7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ember-sinon-qunit/-/ember-sinon-qunit-7.5.0.tgz#12e5a6a01ecfe62b185d1258a2deb7c3334c4fe7" + integrity sha512-wSoRqBbiytUtDFIE6DLPDZFYhoS4FH+kgHhr707HJMF5tUYpKPIruBusF9kWezj/yOrJLyLqoWFoaAJ2aG2FQw== dependencies: - got "^8.0.1" + "@embroider/addon-shim" "^1.8.9" + "@types/sinon" "^17.0.3" + decorator-transforms "^2.0.0" -ember-source@~4.8.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-4.8.0.tgz#1a00280d4e4c8b2d85c5d6f143488b3fddb63075" - integrity sha512-YvVJNia7gDgzKntRWoMz7hdme32GozXnZDYW5kyZLoGq0O5M2hL8D9KHAcEeqCC1UfFjMjtMw4RgA65yPCDx5Q== +ember-source@~4.12.4: + version "4.12.4" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-4.12.4.tgz#9a8c0a7d2f5c40dc781eeba1fb23af38e521fd52" + integrity sha512-HUlNAY+qr/Jm4c/5E11n5w6IvLY7Rr4DxmFv/0LZ3R5LqDSubM1jEmny5zDjOfadMa4pawoCmFFWXVeJEXwppg== dependencies: "@babel/helper-module-imports" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.20.5" "@ember/edition-utils" "^1.2.0" "@glimmer/vm-babel-plugins" "0.84.2" + "@simple-dom/interface" "^1.4.0" babel-plugin-debug-macros "^0.3.4" babel-plugin-filter-imports "^4.0.0" broccoli-concat "^4.2.5" @@ -16519,7 +16527,7 @@ ember-source@~4.8.0: broccoli-funnel "^3.0.8" broccoli-merge-trees "^4.2.0" chalk "^4.0.0" - ember-auto-import "^2.4.1" + ember-auto-import "^2.5.0" ember-cli-babel "^7.26.11" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" @@ -16531,7 +16539,7 @@ ember-source@~4.8.0: ember-router-generator "^2.0.0" inflection "^1.13.2" resolve "^1.22.0" - semver "^7.3.7" + semver "^7.3.8" silent-error "^1.1.1" ember-template-imports@^3.1.1: @@ -16621,41 +16629,6 @@ ember-template-recast@^6.1.4: tmp "^0.2.1" workerpool "^6.4.0" -ember-try-config@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-4.0.0.tgz#8dbdcc071e7acbcb34750b4ed7faf1ab009766f1" - integrity sha512-jAv7fqYJK7QYYekPc/8Nr7KOqDpv/asqM6F8xcRnbmf9UrD35BkSffY63qUuiD9e0aR5qiMNBIQzH8f65rGDqw== - dependencies: - ember-source-channel-url "^3.0.0" - lodash "^4.17.20" - package-json "^6.5.0" - remote-git-tags "^3.0.0" - semver "^7.3.2" - -ember-try@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-2.0.0.tgz#2671c221f5a0335fa2c189d00db7146e2e72a1dd" - integrity sha512-2N7Vic45sbAegA5fhdfDjVbEVS4r+ze+tTQs2/wkY+8fC5yAGHfCM5ocyoTfBN5m7EhznC3AyMsOy4hLPzHFSQ== - dependencies: - chalk "^4.1.2" - cli-table3 "^0.6.0" - core-object "^3.1.5" - debug "^4.3.2" - ember-try-config "^4.0.0" - execa "^4.1.0" - fs-extra "^9.0.1" - resolve "^1.20.0" - rimraf "^3.0.2" - walk-sync "^2.2.0" - -ember-window-mock@~0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/ember-window-mock/-/ember-window-mock-0.8.1.tgz#1fc5db20b3d9fc3592d4ef6f83d6b5a629c79174" - integrity sha512-wl9TJuBYFWKsPqDY2gms2jbre1L39AkrPQ9EqbhqHbZI4aEq8u8IZJ0nJaOa7IVr/Jy/kSUXYQGTgvNhz1AzPw== - dependencies: - ember-cli-babel "^7.26.11" - ember-cli-htmlbars "^6.0.1" - emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -16777,11 +16750,6 @@ entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - entities@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" @@ -17449,6 +17417,11 @@ escalade@^3.1.2: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -17893,7 +17866,7 @@ execa@^2.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.0, execa@^4.1.0: +execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -17953,11 +17926,6 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" -exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.1.0.tgz#318d545213d2b2a31499e92c35f74c94196a22f7" - integrity sha512-qEfFekfBVid4b14FNug/RNY1nv+BADnlzKGHulc+t6ZLqGY4kdHGh1iFha8lnE3sJU/1WzMzKRNxS6EvSakJUg== - exit-hook@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" @@ -18328,10 +18296,10 @@ filelist@^1.0.1: dependencies: minimatch "^5.0.1" -filesize@^9.0.11: - version "9.0.11" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-9.0.11.tgz#4ac3a42c084232dd9b2a1da0107f32d42fcfa5e4" - integrity sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA== +filesize@^10.0.5: + version "10.1.6" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.6.tgz#31194da825ac58689c0bce3948f33ce83aabd361" + integrity sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w== filing-cabinet@^4.1.6: version "4.2.0" @@ -18470,7 +18438,7 @@ find-yarn-workspace-root2@1.2.16: micromatch "^4.0.2" pkg-dir "^4.2.0" -find-yarn-workspace-root@^1.1.0: +find-yarn-workspace-root@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== @@ -18495,10 +18463,10 @@ findup-sync@^4.0.0: micromatch "^4.0.2" resolve-dir "^1.0.1" -fireworm@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.1.tgz#ccf20f7941f108883fcddb99383dbe6e1861c758" - integrity sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g= +fireworm@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/fireworm/-/fireworm-0.7.2.tgz#bc5736515b48bd30bf3293a2062e0b0e0361537a" + integrity sha512-GjebTzq+NKKhfmDxjKq3RXwQcN9xRmZWhnnuC9L+/x5wBQtR0aaQM50HsjrzJ2wc28v1vSdfOpELok0TKR4ddg== dependencies: async "~0.2.9" is-type "0.0.1" @@ -18644,14 +18612,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -18667,7 +18627,7 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^10.0.0, fs-extra@^10.1.0: +fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -19017,11 +18977,6 @@ get-stdin@^9.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - get-stream@6.0.0, get-stream@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" @@ -19267,7 +19222,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^7.2.3, glob@~7.2.0: +glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3, glob@~7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -19279,7 +19234,7 @@ glob@^7.0.0, glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.0: +glob@^8.0.0, glob@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -19503,29 +19458,6 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^8.0.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -19699,23 +19631,11 @@ has-proto@^1.0.1: resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -20251,11 +20171,6 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -20552,11 +20467,16 @@ infer-owner@^1.0.4: resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== -inflection@^1.12.0, inflection@^1.13.1, inflection@^1.13.2: +inflection@^1.13.2: version "1.13.4" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.4.tgz#65aa696c4e2da6225b148d7a154c449366633a32" integrity sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw== +inflection@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-2.0.1.tgz#bdf3a4c05d4275f41234910cbbe9a102ac72c99b" + integrity sha512-wzkZHqpb4eGrOKBl34xy3umnYHx8Si5R1U4fwmdxLo5gdH6mEK8gclckTj/qWqy4Je0bsDYe/qazZYuO7xe3XQ== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -20685,6 +20605,27 @@ inquirer@^7.0.1: strip-ansi "^6.0.0" through "^2.3.6" +inquirer@^8.2.1: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + inquirer@^8.2.4: version "8.2.5" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" @@ -20729,14 +20670,6 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - invariant@^2.2.1, invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -20744,6 +20677,11 @@ invariant@^2.2.1, invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +invert-kv@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" + integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== + ioredis@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.4.1.tgz#1c56b70b759f01465913887375ed809134296f40" @@ -21108,11 +21046,6 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -21197,11 +21130,6 @@ is-relative-path@^1.0.2: resolved "https://registry.yarnpkg.com/is-relative-path/-/is-relative-path-1.0.2.tgz#091b46a0d67c1ed0fe85f1f8cfdde006bb251d46" integrity sha1-CRtGoNZ8HtD+hfH4z93gBrslHUY= -is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" @@ -21253,6 +21181,13 @@ is-string@^1.0.5, is-string@^1.0.7: dependencies: has-tostringtag "^1.0.0" +is-subdir@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" + integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== + dependencies: + better-path-resolve "1.0.0" + is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -21340,7 +21275,7 @@ is-what@^4.1.8: resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -21512,14 +21447,6 @@ istextorbinary@^2.5.1: editions "^2.2.0" textextensions "^2.5.0" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - iterare@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" @@ -22145,7 +22072,7 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@^3.0.1: +jsesc@^3.0.1, jsesc@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== @@ -22287,10 +22214,10 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: array-includes "^3.1.2" object.assign "^4.1.2" -just-extend@^4.0.2: - version "4.1.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" - integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== +just-extend@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" + integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== jwa@^2.0.0: version "2.0.0" @@ -22326,13 +22253,6 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== - dependencies: - json-buffer "3.0.0" - keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -22423,6 +22343,13 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" +lcid@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" + integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg== + dependencies: + invert-kv "^3.0.0" + leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" @@ -22631,13 +22558,6 @@ lines-and-columns@~2.0.3: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== -linkify-it@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" - integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== - dependencies: - uc.micro "^1.0.1" - linkify-it@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" @@ -22856,22 +22776,12 @@ lodash.assign@^3.2.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" -lodash.assignin@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= - lodash.camelcase@^4.1.1, lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.castarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" - integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU= - -lodash.clonedeep@^4.4.1, lodash.clonedeep@^4.5.0: +lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= @@ -22898,11 +22808,6 @@ lodash.defaultsdeep@^4.6.1: resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== -lodash.find@^4.5.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" - integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= - lodash.flatten@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-3.0.2.tgz#de1cf57758f8f4479319d35c3e9cc60c4501938c" @@ -23005,11 +22910,6 @@ 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.uniqby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= - lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -23091,11 +22991,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -23405,6 +23300,13 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -23427,16 +23329,15 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-terminal@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.2.1.tgz#670fd5ea824a7dcaa1591dcbeef28bf70aff1705" - integrity sha512-e8hbK9L+IyFac2qY05R7paP+Fqw1T4pSQW3miK3VeG9QmpqBjg5Qzjv/v6C7YNxSNRS2Kp8hUFtm5lWU9eK4lw== +markdown-it-terminal@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.4.0.tgz#d58466e3de0a638d6a5bd7e16ca51d8e55f3a3ac" + integrity sha512-NeXtgpIK6jBciHTm9UhiPnyHDdqyVIdRPJ+KdQtZaf/wR74gvhCNbw5li4TYsxRp5u3ZoHEF4DwpECeZqyCw+w== dependencies: ansi-styles "^3.0.0" cardinal "^1.0.0" cli-table "^0.3.1" lodash.merge "^4.6.2" - markdown-it "^8.3.1" markdown-it@^13.0.1: version "13.0.1" @@ -23449,17 +23350,6 @@ markdown-it@^13.0.1: mdurl "^1.0.1" uc.micro "^1.0.5" -markdown-it@^8.3.1: - version "8.4.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" - integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== - dependencies: - argparse "^1.0.7" - entities "~1.1.1" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.5" - markdown-table@3.0.3, markdown-table@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" @@ -23671,6 +23561,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.1.0" + memfs@^3.4.3: version "3.6.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" @@ -24192,6 +24091,13 @@ minimatch@5.1.0, minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@^7.4.1: + version "7.4.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb" + integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== + dependencies: + brace-expansion "^2.0.1" + minimatch@^8.0.2: version "8.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" @@ -24385,7 +24291,7 @@ 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.0: +mkdirp@^3.0.1, mkdirp@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== @@ -24885,16 +24791,16 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0" - integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg== +nise@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-6.1.1.tgz#78ea93cc49be122e44cb7c8fdf597b0e8778b64a" + integrity sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g== dependencies: - "@sinonjs/commons" "^2.0.0" - "@sinonjs/fake-timers" "^10.0.2" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^13.0.1" + "@sinonjs/text-encoding" "^0.7.3" + just-extend "^6.2.0" + path-to-regexp "^8.1.0" nitropack@^2.9.7: version "2.9.7" @@ -25280,15 +25186,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - normalize-url@^4.1.0: version "4.5.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" @@ -25380,7 +25277,7 @@ npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: semver "^7.3.5" validate-npm-package-name "^5.0.0" -npm-package-arg@^9.0.0, npm-package-arg@^9.0.1, npm-package-arg@^9.1.0: +npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: version "9.1.2" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.2.tgz#fc8acecb00235f42270dda446f36926ddd9ac2bc" integrity sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg== @@ -26052,6 +25949,15 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= +os-locale@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0" + integrity sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA== + dependencies: + execa "^4.0.0" + lcid "^3.0.0" + mem "^5.0.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -26065,16 +25971,16 @@ osenv@^0.1.3: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + p-defer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" @@ -26097,10 +26003,10 @@ p-finally@^2.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== p-limit@^1.1.0: version "1.3.0" @@ -26218,13 +26124,6 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== - dependencies: - p-finally "^1.0.0" - p-timeout@^3.0.0, p-timeout@^3.1.0, p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" @@ -26266,7 +26165,7 @@ package-json-from-dist@^1.0.0: resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== -package-json@^6.3.0, package-json@^6.5.0: +package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== @@ -26606,6 +26505,11 @@ path-to-regexp@^6.2.0, path-to-regexp@^6.2.1: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== +path-to-regexp@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -26835,6 +26739,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-entry-points@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-entry-points/-/pkg-entry-points-1.1.1.tgz#d5cd87f934e873bf73143ed1d0baf637e5f8fda4" + integrity sha512-BhZa7iaPmB4b3vKIACoppyUoYn8/sFs17VJJtzrzPZvEnN2nqrgg911tdL65lA2m1ml6UI3iPeYbZQ4VXpn1mA== + pkg-types@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" @@ -26904,7 +26813,7 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -portfinder@^1.0.29: +portfinder@^1.0.32: version "1.0.32" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== @@ -28138,15 +28047,6 @@ query-string@^4.2.2: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -28176,20 +28076,22 @@ quick-temp@^0.1.2, 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@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-2.0.0.tgz#c4d7f7676dbb57f54151b72f8366d862134cd1c0" - integrity sha512-mElzLN99wYPOGekahqRA+mq7NcThXY9c+/tDkgJmT7W5LeZAFNyITr2rFKNnCbWLIhuLdFw88kCBMrJSfyBYpA== +qunit-dom@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-3.2.1.tgz#650707b818d5a889ac1923a5cdbdc0d9daf4db7a" + integrity sha512-+qSm8zQ7hPA9NijmTDVsUFNGEFP/K+DTymjlsU01O3NhkGtb9rsZRztJXwaiAlmVSX4vSzjydPxpZCRhpWIq4A== dependencies: - broccoli-funnel "^3.0.3" - broccoli-merge-trees "^4.2.0" - ember-cli-babel "^7.23.0" - ember-cli-version-checker "^5.1.1" + 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.19.2: - version "2.19.2" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.19.2.tgz#0b2388fd14ea8b592792b538bf31cbd20b72bfd3" - integrity sha512-D575YwUeTFvYu9OrCitmnZ24QkcuwwLj3vtMRLHGUvme4oVljna4Qttm19BBDC4w/7wAZr2/QvbvWN6I4inJYg== +qunit@~2.22.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.22.0.tgz#77c26ebfc337bbf82e0e69d4192f0e4454ef134d" + integrity sha512-wPYvAvpjTL3zlUeyCX75T8gfZfdVXZa8y1EVkGe/XZNORIsCH/WI2X8R2KlemT921X9EKSZUL6CLGSPC7Ks08g== dependencies: commander "7.2.0" node-watch "0.7.3" @@ -28488,7 +28390,7 @@ read@^2.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@2.3.7, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: +readable-stream@2.3.7, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -28686,11 +28588,6 @@ regenerator-runtime@0.13.9: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-runtime@^0.13.2: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - regenerator-runtime@^0.13.4: version "0.13.10" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" @@ -28898,11 +28795,6 @@ remark-smartypants@^2.0.0: retext-smartypants "^5.1.0" unist-util-visit "^4.1.0" -remote-git-tags@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-3.0.0.tgz#424f8ec2cdea00bb5af1784a49190f25e16983c3" - integrity sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w== - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -29055,7 +28947,7 @@ resolve-package-path@^3.1.0: path-root "^0.1.1" resolve "^1.17.0" -resolve-package-path@^4.0.0, resolve-package-path@^4.0.1, resolve-package-path@^4.0.3: +resolve-package-path@^4.0.1, resolve-package-path@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-4.0.3.tgz#31dab6897236ea6613c72b83658d88898a9040aa" integrity sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA== @@ -29150,7 +29042,7 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" -responselike@1.0.2, responselike@^1.0.2: +responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== @@ -29432,7 +29324,7 @@ rrweb-cssom@^0.6.0: resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== -rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0: +rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== @@ -29530,16 +29422,16 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -safe-stable-stringify@^2.3.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" - integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== - safe-stable-stringify@^2.4.1: version "2.4.3" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== +safe-stable-stringify@^2.4.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -30067,7 +29959,7 @@ sigstore@^1.3.0, sigstore@^1.4.0: make-fetch-happen "^11.0.1" tuf-js "^1.1.3" -silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1.1: +silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw== @@ -30109,16 +30001,16 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sinon@15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-15.2.0.tgz#5e44d4bc5a9b5d993871137fd3560bebfac27565" - integrity sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw== +sinon@19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-19.0.2.tgz#944cf771d22236aa84fc1ab70ce5bffc3a215dad" + integrity sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g== dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^10.3.0" - "@sinonjs/samsam" "^8.0.0" - diff "^5.1.0" - nise "^5.1.4" + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^13.0.2" + "@sinonjs/samsam" "^8.0.1" + diff "^7.0.0" + nise "^6.1.1" supports-color "^7.2.0" sirv@^2.0.3: @@ -30255,7 +30147,7 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -socket.io@^4.1.2: +socket.io@^4.5.4: version "4.8.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== @@ -30622,11 +30514,6 @@ sqlstring@^2.3.2: resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== -sri-toolbox@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e" - integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= - ssri@^10.0.0, ssri@^10.0.1: version "10.0.4" resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" @@ -31484,10 +31371,10 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -testem@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-3.9.0.tgz#a82ccf01e5a248e3924244186e348c665ab90f7d" - integrity sha512-YTxCYKj0cc8uUSKEziJtSC5T/pw4fQnY0ZXNOyvAFgrijfsN9NxmncJZOHLhPgFOuhbRd5i+DBQxw0Cpe0SEFg== +testem@^3.10.1: + version "3.15.2" + resolved "https://registry.yarnpkg.com/testem/-/testem-3.15.2.tgz#abd6a96077a6576cd730f3d2e476039044c5cb34" + integrity sha512-mRzqZktqTCWi/rUP/RQOKXvMtuvY3lxuzBVb1xGXPnRNGMEj/1DaLGn6X447yOsz6SlWxSsZfcNuiE7fT1MOKg== dependencies: "@xmldom/xmldom" "^0.8.0" backbone "^1.1.2" @@ -31498,22 +31385,18 @@ testem@^3.8.0: consolidate "^0.16.0" execa "^1.0.0" express "^4.10.7" - fireworm "^0.7.0" + fireworm "^0.7.2" glob "^7.0.4" http-proxy "^1.13.1" js-yaml "^3.2.5" - lodash.assignin "^4.1.0" - lodash.castarray "^4.4.0" - lodash.clonedeep "^4.4.1" - lodash.find "^4.5.1" - lodash.uniqby "^4.7.0" - mkdirp "^1.0.4" + lodash "^4.17.21" + mkdirp "^3.0.1" mustache "^4.2.0" node-notifier "^10.0.0" npmlog "^6.0.0" printf "^0.6.1" rimraf "^3.0.2" - socket.io "^4.1.2" + socket.io "^4.5.4" spawn-args "^0.2.0" styled_string "0.0.1" tap-parser "^7.0.0" @@ -31579,11 +31462,6 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - 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" @@ -32009,6 +31887,11 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^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.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" @@ -32779,6 +32662,14 @@ update-browserslist-db@^1.1.0: escalade "^3.1.2" picocolors "^1.0.1" +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + update-notifier@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" @@ -32831,11 +32722,6 @@ url-parse@^1.5.3, url-parse@~1.5.10: querystringify "^2.1.1" requires-port "^1.0.0" -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - urlpattern-polyfill@8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" @@ -32980,14 +32866,6 @@ validate-peer-dependencies@^1.1.0: resolve-package-path "^3.1.0" semver "^7.3.2" -validate-peer-dependencies@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-2.1.0.tgz#1ad8218b1b168aeb500165f9de2a3f53269ece56" - integrity sha512-x+M+mp16g4N+jDQJO6a+AKnMHAViov9mRzYfgMYR6Bq+UTwewf8aTQsP+e1QH0oZrADqP7fuI/bEbl3CzRFhOQ== - dependencies: - resolve-package-path "^4.0.0" - semver "^7.3.2" - value-equal@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.2.1.tgz#c220a304361fce6994dbbedaa3c7e1a1b895871d" @@ -33352,14 +33230,6 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" -walk-sync@^0.2.5: - version "0.2.7" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" - integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= - dependencies: - ensure-posix-path "^1.0.0" - matcher-collection "^1.0.0" - walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.3: version "0.3.4" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4" @@ -33668,6 +33538,35 @@ webpack@^5.95.0, webpack@~5.95.0: watchpack "^2.4.1" webpack-sources "^3.2.3" +webpack@~5.95.0: + version "5.95.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" + integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== + dependencies: + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" @@ -33906,7 +33805,7 @@ workerpool@^6.0.2: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -workerpool@^6.1.5, workerpool@^6.2.1: +workerpool@^6.1.5: version "6.2.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== @@ -33959,6 +33858,15 @@ wrap-ansi@7.0.0, wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From a15ce3050109a135df77e7aaa66cdaa499bb5b58 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Thu, 31 Oct 2024 11:30:53 +0100 Subject: [PATCH 06/31] feat(browser): Add `skipBrowserExtensionCheck` escape hatch option (#14147) Add a general escape hatch for the browser extension detection check in favour of further bloating the bundle size by introducing more special cases in the extension check. This way, we still initially block `Sentry.init` and make users think twice how to proceed. However, we don't have to adapt the check every time a false positive gets reported. --- .../force-init-chrome-extension/init.js | 11 ++++++++++ .../force-init-chrome-extension/test.ts | 16 ++++++++++++++ packages/browser/src/client.ts | 21 ++++++++++++++++++- packages/browser/src/sdk.ts | 2 +- 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/init.js create mode 100644 dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/test.ts diff --git a/dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/init.js b/dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/init.js new file mode 100644 index 000000000000..5d5cb2799a4e --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/init.js @@ -0,0 +1,11 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +// We mock this here to simulate a Chrome browser extension +window.chrome = { runtime: { id: 'mock-extension-id' } }; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + skipBrowserExtensionCheck: true, +}); diff --git a/dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/test.ts b/dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/test.ts new file mode 100644 index 000000000000..204544aaa7bc --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/manual-client/force-init-chrome-extension/test.ts @@ -0,0 +1,16 @@ +import { expect } from '@playwright/test'; +import { sentryTest } from '../../../utils/fixtures'; + +sentryTest( + 'initializes inside a Chrome browser extension if `skipBrowserExtensionCheck` is set', + async ({ getLocalTestUrl, page }) => { + const url = await getLocalTestUrl({ testDir: __dirname }); + await page.goto(url); + + const isInitialized = await page.evaluate(() => { + return !!(window as any).Sentry.isInitialized(); + }); + + expect(isInitialized).toBe(true); + }, +); diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index 177d787a438d..851f830d6955 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -26,7 +26,26 @@ import { createUserFeedbackEnvelope } from './userfeedback'; */ export type BrowserOptions = Options & BrowserClientReplayOptions & - BrowserClientProfilingOptions; + BrowserClientProfilingOptions & { + /** + * Important: Only set this option if you know what you are doing! + * + * By default, the SDK will check if `Sentry.init` is called in a browser extension. + * In case it is, it will stop initialization and log a warning + * because browser extensions require a different Sentry initialization process: + * https://docs.sentry.io/platforms/javascript/best-practices/shared-environments/ + * + * Setting up the SDK in a browser extension with global error monitoring is not recommended + * and will likely flood you with errors from other web sites or extensions. This can heavily + * impact your quota and cause interference with your and other Sentry SDKs in shared environments. + * + * If this check wrongfully flags your setup as a browser extension, you can set this + * option to `true` to skip the check. + * + * @default false + */ + skipBrowserExtensionCheck?: boolean; + }; /** * Configuration options for the Sentry Browser SDK Client class diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 1a0296341341..cd15af8fef1f 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -160,7 +160,7 @@ declare const __SENTRY_RELEASE__: string | undefined; export function init(browserOptions: BrowserOptions = {}): Client | undefined { const options = applyDefaultOptions(browserOptions); - if (shouldShowBrowserExtensionError()) { + if (!options.skipBrowserExtensionCheck && shouldShowBrowserExtensionError()) { consoleSandbox(() => { // eslint-disable-next-line no-console console.error( From d2a9826f24f1aae9201f9b352d47df584dfeea93 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Thu, 31 Oct 2024 12:46:40 +0100 Subject: [PATCH 07/31] feat(browser): Add `http.response_delivery_type` attribute to resource spans (#14056) Add the `deliveryType` field of a `ResourcePeformanceEntry` to our `op: resource` spans. This [attribute](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType) can give a definitive answer if a resource was retrieved from the browser cache or if the request was actually made to the resource src. --- .../startSpan/attributes/subject.js | 11 ++++++++ .../public-api/startSpan/attributes/test.ts | 21 +++++++++++++++ .../src/metrics/browserMetrics.ts | 5 ++++ .../test/browser/browserMetrics.test.ts | 26 +++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/subject.js create mode 100644 dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/test.ts diff --git a/dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/subject.js b/dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/subject.js new file mode 100644 index 000000000000..d91cfe341de9 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/subject.js @@ -0,0 +1,11 @@ +async function run() { + Sentry.startSpan({ name: 'parent_span' }, () => { + Sentry.startSpan({ name: 'child_span', attributes: { someAttribute: '' } }, () => { + // whatever a user would do here + }); + }); +} + +(async () => { + await run(); +})(); diff --git a/dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/test.ts b/dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/test.ts new file mode 100644 index 000000000000..a5e3e651467a --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/public-api/startSpan/attributes/test.ts @@ -0,0 +1,21 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { + envelopeRequestParser, + shouldSkipTracingTest, + waitForTransactionRequestOnUrl, +} from '../../../../utils/helpers'; + +sentryTest('sends an empty string attribute', async ({ getLocalTestPath, page }) => { + if (shouldSkipTracingTest()) { + sentryTest.skip(); + } + + const url = await getLocalTestPath({ testDir: __dirname }); + const req = await waitForTransactionRequestOnUrl(page, url); + const transaction = envelopeRequestParser(req); + + const childSpan = transaction.spans?.[0]; + expect(childSpan?.data?.someAttribute).toBe(''); +}); diff --git a/packages/browser-utils/src/metrics/browserMetrics.ts b/packages/browser-utils/src/metrics/browserMetrics.ts index 3b98558f2728..5789bbe94513 100644 --- a/packages/browser-utils/src/metrics/browserMetrics.ts +++ b/packages/browser-utils/src/metrics/browserMetrics.ts @@ -513,6 +513,7 @@ export interface ResourceEntry extends Record { encodedBodySize?: number; decodedBodySize?: number; renderBlockingStatus?: string; + deliveryType?: string; } /** Create resource-related spans */ @@ -539,6 +540,10 @@ export function _addResourceSpans( setResourceEntrySizeData(attributes, entry, 'encodedBodySize', 'http.response_content_length'); setResourceEntrySizeData(attributes, entry, 'decodedBodySize', 'http.decoded_response_content_length'); + if (entry.deliveryType != null) { + attributes['http.response_delivery_type'] = entry.deliveryType; + } + if ('renderBlockingStatus' in entry) { attributes['resource.render_blocking_status'] = entry.renderBlockingStatus; } diff --git a/packages/browser-utils/test/browser/browserMetrics.test.ts b/packages/browser-utils/test/browser/browserMetrics.test.ts index 8e67df1645d0..be78df6920fc 100644 --- a/packages/browser-utils/test/browser/browserMetrics.test.ts +++ b/packages/browser-utils/test/browser/browserMetrics.test.ts @@ -338,6 +338,32 @@ describe('_addResourceSpans', () => { }), ); }); + + // resource delivery types: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType + // i.e. better but not yet widely supported way to check for browser cache hit + it.each(['cache', 'navigational-prefetch', ''])( + 'attaches delivery type ("%s") to resource spans if available', + deliveryType => { + const spans: Span[] = []; + + getClient()?.on('spanEnd', span => { + spans.push(span); + }); + + const entry: ResourceEntry = { + initiatorType: 'css', + transferSize: 0, + encodedBodySize: 0, + decodedBodySize: 0, + deliveryType, + }; + + _addResourceSpans(span, entry, resourceEntryName, 100, 23, 345); + + expect(spans).toHaveLength(1); + expect(spanToJSON(spans[0]!).data).toMatchObject({ 'http.response_delivery_type': deliveryType }); + }, + ); }); const setGlobalLocation = (location: Location) => { From f2f75d7b90b0cad0507dde743ea8cfc250ab078a Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Mon, 28 Oct 2024 17:18:54 +0100 Subject: [PATCH 08/31] feat(nuxt): Add `asyncFunctionReExports` to define re-exported server functions --- packages/nuxt/src/common/types.ts | 11 +++++++ packages/nuxt/src/module.ts | 5 ++- packages/nuxt/src/vite/addServerConfig.ts | 39 ++++++++++++++++++----- packages/nuxt/src/vite/utils.ts | 6 ++-- packages/nuxt/test/vite/utils.test.ts | 12 +++---- 5 files changed, 55 insertions(+), 18 deletions(-) diff --git a/packages/nuxt/src/common/types.ts b/packages/nuxt/src/common/types.ts index 6ba29752a308..787d9625d853 100644 --- a/packages/nuxt/src/common/types.ts +++ b/packages/nuxt/src/common/types.ts @@ -117,6 +117,17 @@ export type SentryNuxtModuleOptions = { */ dynamicImportForServerEntry?: boolean; + /** + * The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value). + * + * As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported. + * The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions. + * In case you have a custom setup and your server exports other async functions, you can override the default array with this option. + * + * @default ['default', 'handler', 'server'] + */ + asyncFunctionReExports?: string[]; + /** * Options to be passed directly to the Sentry Rollup Plugin (`@sentry/rollup-plugin`) and Sentry Vite Plugin (`@sentry/vite-plugin`) that ship with the Sentry Nuxt SDK. * You can use this option to override any options the SDK passes to the Vite (for Nuxt) and Rollup (for Nitro) plugin. diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index 56fa71ad95a3..c7e64061c26a 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -21,6 +21,9 @@ export default defineNuxtModule({ const moduleOptions = { ...moduleOptionsParam, dynamicImportForServerEntry: moduleOptionsParam.dynamicImportForServerEntry !== false, // default: true + asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports + ? moduleOptionsParam.asyncFunctionReExports + : ['default', 'handler', 'server'], }; const moduleDirResolver = createResolver(import.meta.url); @@ -101,7 +104,7 @@ export default defineNuxtModule({ }); } } else { - addDynamicImportEntryFileWrapper(nitro, serverConfigFile); + addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions); if (moduleOptions.debug) { consoleSandbox(() => { diff --git a/packages/nuxt/src/vite/addServerConfig.ts b/packages/nuxt/src/vite/addServerConfig.ts index fe86895a76f2..4e1a8fa16de1 100644 --- a/packages/nuxt/src/vite/addServerConfig.ts +++ b/packages/nuxt/src/vite/addServerConfig.ts @@ -81,7 +81,12 @@ export function addServerConfigToBuild( * With this, the Sentry server config can be loaded before all other modules of the application (which is needed for import-in-the-middle). * See: https://nodejs.org/api/module.html#enabling */ -export function addDynamicImportEntryFileWrapper(nitro: Nitro, serverConfigFile: string): void { +export function addDynamicImportEntryFileWrapper( + nitro: Nitro, + serverConfigFile: string, + moduleOptions: Omit & + Required>, +): void { if (!nitro.options.rollupConfig) { nitro.options.rollupConfig = { output: {} }; } @@ -94,7 +99,10 @@ export function addDynamicImportEntryFileWrapper(nitro: Nitro, serverConfigFile: } nitro.options.rollupConfig.plugins.push( - wrapEntryWithDynamicImport(createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`)), + wrapEntryWithDynamicImport({ + resolvedSentryConfigPath: createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`), + asyncFunctionReExports: moduleOptions.asyncFunctionReExports, + }), ); } @@ -103,7 +111,11 @@ export function addDynamicImportEntryFileWrapper(nitro: Nitro, serverConfigFile: * by using a regular `import` and load the server after that. * This also works with serverless `handler` functions, as it re-exports the `handler`. */ -function wrapEntryWithDynamicImport(resolvedSentryConfigPath: string): InputPluginOption { +function wrapEntryWithDynamicImport({ + resolvedSentryConfigPath, + asyncFunctionReExports, + debug, +}: { resolvedSentryConfigPath: string; asyncFunctionReExports: string[]; debug?: boolean }): InputPluginOption { return { name: 'sentry-wrap-entry-with-dynamic-import', async resolveId(source, importer, options) { @@ -129,9 +141,20 @@ function wrapEntryWithDynamicImport(resolvedSentryConfigPath: string): InputPlug moduleInfo.moduleSideEffects = true; - // `exportedBindings` can look like this: `{ '.': [ 'handler' ], './firebase-gen-1.mjs': [ 'server' ] }` + // `exportedBindings` can look like this: `{ '.': [ 'handler' ] }` or `{ '.': [], './firebase-gen-1.mjs': [ 'server' ] }` // The key `.` refers to exports within the current file, while other keys show from where exports were imported first. - const exportedFunctions = flatten(Object.values(moduleInfo.exportedBindings || {})); + const functionsToExport = flatten(Object.values(moduleInfo.exportedBindings || {})).filter(functionName => + asyncFunctionReExports.includes(functionName), + ); + + if (debug && functionsToExport.length === 0) { + consoleSandbox(() => + // eslint-disable-next-line no-console + console.warn( + "[Sentry] No functions found for re-export. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.asyncFunctionReExports` in your `nuxt.config.ts`.", + ), + ); + } // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`) @@ -139,7 +162,7 @@ function wrapEntryWithDynamicImport(resolvedSentryConfigPath: string): InputPlug : resolution.id // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler) .concat(SENTRY_WRAPPED_ENTRY) - .concat(exportedFunctions?.length ? SENTRY_FUNCTIONS_REEXPORT.concat(exportedFunctions.join(',')) : '') + .concat(functionsToExport?.length ? SENTRY_FUNCTIONS_REEXPORT.concat(functionsToExport.join(',')) : '') .concat(QUERY_END_INDICATOR); } return null; @@ -149,7 +172,7 @@ function wrapEntryWithDynamicImport(resolvedSentryConfigPath: string): InputPlug const entryId = removeSentryQueryFromPath(id); // Mostly useful for serverless `handler` functions - const reExportedFunctions = id.includes(SENTRY_FUNCTIONS_REEXPORT) + const reExportedAsyncFunctions = id.includes(SENTRY_FUNCTIONS_REEXPORT) ? constructFunctionReExport(id, entryId) : ''; @@ -161,7 +184,7 @@ function wrapEntryWithDynamicImport(resolvedSentryConfigPath: string): InputPlug `import(${JSON.stringify(entryId)});\n` + // By importing "import-in-the-middle/hook.mjs", we can make sure this file wil be included, as not all node builders are including files imported with `module.register()`. "import 'import-in-the-middle/hook.mjs';\n" + - `${reExportedFunctions}\n` + `${reExportedAsyncFunctions}\n` ); } diff --git a/packages/nuxt/src/vite/utils.ts b/packages/nuxt/src/vite/utils.ts index 1737a47e8062..18b3c6846dfb 100644 --- a/packages/nuxt/src/vite/utils.ts +++ b/packages/nuxt/src/vite/utils.ts @@ -70,13 +70,13 @@ export function constructFunctionReExport(pathWithQuery: string, entryId: string const functionNames = extractFunctionReexportQueryParameters(pathWithQuery); return functionNames.reduce( - (functionsCode, currFunctionName) => + (functionsCode, currFunctionName, idx) => functionsCode.concat( - 'async function reExport(...args) {\n' + + `async function reExport${idx}(...args) {\n` + ` const res = await import(${JSON.stringify(entryId)});\n` + ` return res.${currFunctionName}.call(this, ...args);\n` + '}\n' + - `export { reExport as ${currFunctionName} };\n`, + `export { reExport${idx} as ${currFunctionName} };\n`, ), '', ); diff --git a/packages/nuxt/test/vite/utils.test.ts b/packages/nuxt/test/vite/utils.test.ts index a38dbdc44793..200eab9e414c 100644 --- a/packages/nuxt/test/vite/utils.test.ts +++ b/packages/nuxt/test/vite/utils.test.ts @@ -111,16 +111,16 @@ describe('constructFunctionReExport', () => { const result2 = constructFunctionReExport(query2, entryId); const expected = ` -async function reExport(...args) { +async function reExport0(...args) { const res = await import("./module"); return res.foo.call(this, ...args); } -export { reExport as foo }; -async function reExport(...args) { +export { reExport0 as foo }; +async function reExport1(...args) { const res = await import("./module"); return res.bar.call(this, ...args); } -export { reExport as bar }; +export { reExport1 as bar }; `; expect(result.trim()).toBe(expected.trim()); expect(result2.trim()).toBe(expected.trim()); @@ -132,11 +132,11 @@ export { reExport as bar }; const result = constructFunctionReExport(query, entryId); const expected = ` -async function reExport(...args) { +async function reExport0(...args) { const res = await import("./index"); return res.default.call(this, ...args); } -export { reExport as default }; +export { reExport0 as default }; `; expect(result.trim()).toBe(expected.trim()); }); From 6a29eba27c0dbee893bab954a4469d5896159e5f Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 31 Oct 2024 09:38:00 +0100 Subject: [PATCH 09/31] review comments: add test --- packages/nuxt/src/common/types.ts | 9 ++-- packages/nuxt/src/module.ts | 4 +- packages/nuxt/src/vite/addServerConfig.ts | 20 ++------ packages/nuxt/src/vite/utils.ts | 34 +++++++++++-- packages/nuxt/test/vite/utils.test.ts | 60 ++++++++++++++++++++--- 5 files changed, 94 insertions(+), 33 deletions(-) diff --git a/packages/nuxt/src/common/types.ts b/packages/nuxt/src/common/types.ts index 787d9625d853..06c4ea241ef5 100644 --- a/packages/nuxt/src/common/types.ts +++ b/packages/nuxt/src/common/types.ts @@ -118,11 +118,12 @@ export type SentryNuxtModuleOptions = { dynamicImportForServerEntry?: boolean; /** - * The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value). + * By default—unless you configure `dynamicImportForServerEntry: false`—the SDK will try to wrap your application entrypoint + * with a dynamic `import()` to ensure all dependencies can be properly instrumented. * - * As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported. - * The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions. - * In case you have a custom setup and your server exports other async functions, you can override the default array with this option. + * By default, the SDK will wrap the default export as well as a `handler` or `server` export from the entrypoint. + * If your application has a different main export that is used to run the application, you can overwrite this by providing an array of export names to wrap. + * Any wrapped export is expected to be an async function. * * @default ['default', 'handler', 'server'] */ diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index c7e64061c26a..1d3ee2c3c544 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -21,9 +21,7 @@ export default defineNuxtModule({ const moduleOptions = { ...moduleOptionsParam, dynamicImportForServerEntry: moduleOptionsParam.dynamicImportForServerEntry !== false, // default: true - asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports - ? moduleOptionsParam.asyncFunctionReExports - : ['default', 'handler', 'server'], + asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports || ['default', 'handler', 'server'], }; const moduleDirResolver = createResolver(import.meta.url); diff --git a/packages/nuxt/src/vite/addServerConfig.ts b/packages/nuxt/src/vite/addServerConfig.ts index 4e1a8fa16de1..667c33e9f8e2 100644 --- a/packages/nuxt/src/vite/addServerConfig.ts +++ b/packages/nuxt/src/vite/addServerConfig.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import { createResolver } from '@nuxt/kit'; import type { Nuxt } from '@nuxt/schema'; -import { consoleSandbox, flatten } from '@sentry/utils'; +import { consoleSandbox } from '@sentry/utils'; import type { Nitro } from 'nitropack'; import type { InputPluginOption } from 'rollup'; import type { SentryNuxtModuleOptions } from '../common/types'; @@ -10,6 +10,7 @@ import { SENTRY_FUNCTIONS_REEXPORT, SENTRY_WRAPPED_ENTRY, constructFunctionReExport, + constructFunctionsReExportQuery, removeSentryQueryFromPath, } from './utils'; @@ -141,28 +142,13 @@ function wrapEntryWithDynamicImport({ moduleInfo.moduleSideEffects = true; - // `exportedBindings` can look like this: `{ '.': [ 'handler' ] }` or `{ '.': [], './firebase-gen-1.mjs': [ 'server' ] }` - // The key `.` refers to exports within the current file, while other keys show from where exports were imported first. - const functionsToExport = flatten(Object.values(moduleInfo.exportedBindings || {})).filter(functionName => - asyncFunctionReExports.includes(functionName), - ); - - if (debug && functionsToExport.length === 0) { - consoleSandbox(() => - // eslint-disable-next-line no-console - console.warn( - "[Sentry] No functions found for re-export. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.asyncFunctionReExports` in your `nuxt.config.ts`.", - ), - ); - } - // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`) ? resolution.id : resolution.id // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler) .concat(SENTRY_WRAPPED_ENTRY) - .concat(functionsToExport?.length ? SENTRY_FUNCTIONS_REEXPORT.concat(functionsToExport.join(',')) : '') + .concat(constructFunctionsReExportQuery(moduleInfo.exportedBindings, asyncFunctionReExports, debug)) .concat(QUERY_END_INDICATOR); } return null; diff --git a/packages/nuxt/src/vite/utils.ts b/packages/nuxt/src/vite/utils.ts index 18b3c6846dfb..17560e8abf8b 100644 --- a/packages/nuxt/src/vite/utils.ts +++ b/packages/nuxt/src/vite/utils.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; +import { consoleSandbox, flatten } from '@sentry/utils'; /** * Find the default SDK init file for the given type (client or server). @@ -63,6 +64,33 @@ export function extractFunctionReexportQueryParameters(query: string): string[] : []; } +/** + * Constructs a comma-separated string with all functions that need to be re-exported later from the server entry. + * It uses Rollup's `exportedBindings` to determine the functions to re-export + */ +export function constructFunctionsReExportQuery( + exportedBindings: Record | null, + asyncFunctionReExports: string[], + debug?: boolean, +): string { + // `exportedBindings` can look like this: `{ '.': [ 'handler' ] }` or `{ '.': [], './firebase-gen-1.mjs': [ 'server' ] }` + // The key `.` refers to exports within the current file, while other keys show from where exports were imported first. + const functionsToExport = flatten(Object.values(exportedBindings || {})).filter(functionName => + asyncFunctionReExports.includes(functionName), + ); + + if (debug && functionsToExport.length === 0) { + consoleSandbox(() => + // eslint-disable-next-line no-console + console.warn( + "[Sentry] No functions found for re-export. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.asyncFunctionReExports` in your `nuxt.config.ts`.", + ), + ); + } + + return functionsToExport?.length ? SENTRY_FUNCTIONS_REEXPORT.concat(functionsToExport.join(',')) : ''; +} + /** * Constructs a code snippet with function reexports (can be used in Rollup plugins) */ @@ -70,13 +98,13 @@ export function constructFunctionReExport(pathWithQuery: string, entryId: string const functionNames = extractFunctionReexportQueryParameters(pathWithQuery); return functionNames.reduce( - (functionsCode, currFunctionName, idx) => + (functionsCode, currFunctionName) => functionsCode.concat( - `async function reExport${idx}(...args) {\n` + + `async function reExport${currFunctionName.toUpperCase()}(...args) {\n` + ` const res = await import(${JSON.stringify(entryId)});\n` + ` return res.${currFunctionName}.call(this, ...args);\n` + '}\n' + - `export { reExport${idx} as ${currFunctionName} };\n`, + `export { reExport${currFunctionName.toUpperCase()} as ${currFunctionName} };\n`, ), '', ); diff --git a/packages/nuxt/test/vite/utils.test.ts b/packages/nuxt/test/vite/utils.test.ts index 200eab9e414c..20f8d6de2e62 100644 --- a/packages/nuxt/test/vite/utils.test.ts +++ b/packages/nuxt/test/vite/utils.test.ts @@ -5,6 +5,7 @@ import { SENTRY_FUNCTIONS_REEXPORT, SENTRY_WRAPPED_ENTRY, constructFunctionReExport, + constructFunctionsReExportQuery, extractFunctionReexportQueryParameters, findDefaultSdkInitFile, removeSentryQueryFromPath, @@ -102,6 +103,38 @@ describe('extractFunctionReexportQueryParameters', () => { }); }); +describe('constructFunctionsReExportQuery', () => { + it.each([ + [{ '.': ['handler'] }, ['handler'], '?sentry-query-functions-reexport=handler'], + [{ '.': ['handler'], './module': ['server'] }, [], ''], + [{ '.': ['handler'], './module': ['server'] }, ['server'], '?sentry-query-functions-reexport=server'], + [{ '.': ['handler', 'otherFunction'] }, ['handler'], '?sentry-query-functions-reexport=handler'], + [{ '.': ['handler', 'otherFn'] }, ['handler', 'otherFn'], '?sentry-query-functions-reexport=handler,otherFn'], + [{ '.': ['bar'], './module': ['foo'] }, ['bar', 'foo'], '?sentry-query-functions-reexport=bar,foo'], + ])( + 'constructs re-export query for exportedBindings: %j and asyncFunctionReExports: %j', + (exportedBindings, asyncFunctionReExports, expected) => { + const result = constructFunctionsReExportQuery(exportedBindings, asyncFunctionReExports); + expect(result).toBe(expected); + }, + ); + + it('logs a warning if no functions are found for re-export and debug is true', () => { + const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + const exportedBindings = { '.': ['handler'] }; + const asyncFunctionReExports = ['nonExistentFunction']; + const debug = true; + + const result = constructFunctionsReExportQuery(exportedBindings, asyncFunctionReExports, debug); + expect(result).toBe(''); + expect(consoleWarnSpy).toHaveBeenCalledWith( + "[Sentry] No functions found for re-export. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.asyncFunctionReExports` in your `nuxt.config.ts`.", + ); + + consoleWarnSpy.mockRestore(); + }); +}); + describe('constructFunctionReExport', () => { it('constructs re-export code for given query parameters and entry ID', () => { const query = `${SENTRY_FUNCTIONS_REEXPORT}foo,bar,${QUERY_END_INDICATOR}}`; @@ -111,16 +144,16 @@ describe('constructFunctionReExport', () => { const result2 = constructFunctionReExport(query2, entryId); const expected = ` -async function reExport0(...args) { +async function reExportFOO(...args) { const res = await import("./module"); return res.foo.call(this, ...args); } -export { reExport0 as foo }; -async function reExport1(...args) { +export { reExportFOO as foo }; +async function reExportBAR(...args) { const res = await import("./module"); return res.bar.call(this, ...args); } -export { reExport1 as bar }; +export { reExportBAR as bar }; `; expect(result.trim()).toBe(expected.trim()); expect(result2.trim()).toBe(expected.trim()); @@ -132,11 +165,26 @@ export { reExport1 as bar }; const result = constructFunctionReExport(query, entryId); const expected = ` -async function reExport0(...args) { +async function reExportDEFAULT(...args) { + const res = await import("./index"); + return res.default.call(this, ...args); +} +export { reExportDEFAULT as default }; +`; + expect(result.trim()).toBe(expected.trim()); + }); + + it('constructs re-export code for a "default" query parameters and entry ID', () => { + const query = `${SENTRY_FUNCTIONS_REEXPORT}default${QUERY_END_INDICATOR}}`; + const entryId = './index'; + const result = constructFunctionReExport(query, entryId); + + const expected = ` +async function reExportDEFAULT(...args) { const res = await import("./index"); return res.default.call(this, ...args); } -export { reExport0 as default }; +export { reExportDEFAULT as default }; `; expect(result.trim()).toBe(expected.trim()); }); From 9ed947178392f564ba803afb2a54e63e74314691 Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 31 Oct 2024 13:26:19 +0100 Subject: [PATCH 10/31] reexport and wrap functions --- packages/nuxt/src/common/types.ts | 5 +- packages/nuxt/src/module.ts | 2 +- packages/nuxt/src/vite/addServerConfig.ts | 28 +++-- packages/nuxt/src/vite/utils.ts | 104 ++++++++++++------ packages/nuxt/test/vite/utils.test.ts | 127 ++++++++++++++++------ 5 files changed, 183 insertions(+), 83 deletions(-) diff --git a/packages/nuxt/src/common/types.ts b/packages/nuxt/src/common/types.ts index 06c4ea241ef5..39158f28bb14 100644 --- a/packages/nuxt/src/common/types.ts +++ b/packages/nuxt/src/common/types.ts @@ -119,7 +119,8 @@ export type SentryNuxtModuleOptions = { /** * By default—unless you configure `dynamicImportForServerEntry: false`—the SDK will try to wrap your application entrypoint - * with a dynamic `import()` to ensure all dependencies can be properly instrumented. + * with a dynamic `import()` to ensure all dependencies can be properly instrumented. Any previous exports from the entrypoint are still exported. + * Most exports of the server entrypoint are serverless functions and those are wrapped by Sentry. Other exports stay as-is. * * By default, the SDK will wrap the default export as well as a `handler` or `server` export from the entrypoint. * If your application has a different main export that is used to run the application, you can overwrite this by providing an array of export names to wrap. @@ -127,7 +128,7 @@ export type SentryNuxtModuleOptions = { * * @default ['default', 'handler', 'server'] */ - asyncFunctionReExports?: string[]; + entrypointWrappedFunctions?: string[]; /** * Options to be passed directly to the Sentry Rollup Plugin (`@sentry/rollup-plugin`) and Sentry Vite Plugin (`@sentry/vite-plugin`) that ship with the Sentry Nuxt SDK. diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index 1d3ee2c3c544..426ab2f41edf 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -21,7 +21,7 @@ export default defineNuxtModule({ const moduleOptions = { ...moduleOptionsParam, dynamicImportForServerEntry: moduleOptionsParam.dynamicImportForServerEntry !== false, // default: true - asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports || ['default', 'handler', 'server'], + entrypointWrappedFunctions: moduleOptionsParam.entrypointWrappedFunctions || ['default', 'handler', 'server'], }; const moduleDirResolver = createResolver(import.meta.url); diff --git a/packages/nuxt/src/vite/addServerConfig.ts b/packages/nuxt/src/vite/addServerConfig.ts index 667c33e9f8e2..cf4b2a95473e 100644 --- a/packages/nuxt/src/vite/addServerConfig.ts +++ b/packages/nuxt/src/vite/addServerConfig.ts @@ -7,10 +7,11 @@ import type { InputPluginOption } from 'rollup'; import type { SentryNuxtModuleOptions } from '../common/types'; import { QUERY_END_INDICATOR, - SENTRY_FUNCTIONS_REEXPORT, + SENTRY_REEXPORTED_FUNCTIONS, SENTRY_WRAPPED_ENTRY, + SENTRY_WRAPPED_FUNCTIONS, constructFunctionReExport, - constructFunctionsReExportQuery, + constructWrappedFunctionExportQuery, removeSentryQueryFromPath, } from './utils'; @@ -85,8 +86,8 @@ export function addServerConfigToBuild( export function addDynamicImportEntryFileWrapper( nitro: Nitro, serverConfigFile: string, - moduleOptions: Omit & - Required>, + moduleOptions: Omit & + Required>, ): void { if (!nitro.options.rollupConfig) { nitro.options.rollupConfig = { output: {} }; @@ -102,7 +103,7 @@ export function addDynamicImportEntryFileWrapper( nitro.options.rollupConfig.plugins.push( wrapEntryWithDynamicImport({ resolvedSentryConfigPath: createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`), - asyncFunctionReExports: moduleOptions.asyncFunctionReExports, + entrypointWrappedFunctions: moduleOptions.entrypointWrappedFunctions, }), ); } @@ -114,9 +115,9 @@ export function addDynamicImportEntryFileWrapper( */ function wrapEntryWithDynamicImport({ resolvedSentryConfigPath, - asyncFunctionReExports, + entrypointWrappedFunctions, debug, -}: { resolvedSentryConfigPath: string; asyncFunctionReExports: string[]; debug?: boolean }): InputPluginOption { +}: { resolvedSentryConfigPath: string; entrypointWrappedFunctions: string[]; debug?: boolean }): InputPluginOption { return { name: 'sentry-wrap-entry-with-dynamic-import', async resolveId(source, importer, options) { @@ -148,7 +149,9 @@ function wrapEntryWithDynamicImport({ : resolution.id // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler) .concat(SENTRY_WRAPPED_ENTRY) - .concat(constructFunctionsReExportQuery(moduleInfo.exportedBindings, asyncFunctionReExports, debug)) + .concat( + constructWrappedFunctionExportQuery(moduleInfo.exportedBindings, entrypointWrappedFunctions, debug), + ) .concat(QUERY_END_INDICATOR); } return null; @@ -158,9 +161,10 @@ function wrapEntryWithDynamicImport({ const entryId = removeSentryQueryFromPath(id); // Mostly useful for serverless `handler` functions - const reExportedAsyncFunctions = id.includes(SENTRY_FUNCTIONS_REEXPORT) - ? constructFunctionReExport(id, entryId) - : ''; + const reExportedFunctions = + id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS) + ? constructFunctionReExport(id, entryId) + : ''; return ( // Regular `import` of the Sentry config @@ -170,7 +174,7 @@ function wrapEntryWithDynamicImport({ `import(${JSON.stringify(entryId)});\n` + // By importing "import-in-the-middle/hook.mjs", we can make sure this file wil be included, as not all node builders are including files imported with `module.register()`. "import 'import-in-the-middle/hook.mjs';\n" + - `${reExportedAsyncFunctions}\n` + `${reExportedFunctions}\n` ); } diff --git a/packages/nuxt/src/vite/utils.ts b/packages/nuxt/src/vite/utils.ts index 17560e8abf8b..8822ad0e6e8f 100644 --- a/packages/nuxt/src/vite/utils.ts +++ b/packages/nuxt/src/vite/utils.ts @@ -27,7 +27,8 @@ export function findDefaultSdkInitFile(type: 'server' | 'client'): string | unde } export const SENTRY_WRAPPED_ENTRY = '?sentry-query-wrapped-entry'; -export const SENTRY_FUNCTIONS_REEXPORT = '?sentry-query-functions-reexport='; +export const SENTRY_WRAPPED_FUNCTIONS = '?sentry-query-wrapped-functions='; +export const SENTRY_REEXPORTED_FUNCTIONS = '?sentry-query-reexported-functions='; export const QUERY_END_INDICATOR = 'SENTRY-QUERY-END'; /** @@ -49,63 +50,102 @@ export function removeSentryQueryFromPath(url: string): string { * * Only exported for testing. */ -export function extractFunctionReexportQueryParameters(query: string): string[] { +export function extractFunctionReexportQueryParameters(query: string): { wrap: string[]; reexport: string[] } { // Regex matches the comma-separated params between the functions query // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor - const regex = new RegExp(`\\${SENTRY_FUNCTIONS_REEXPORT}(.*?)\\${QUERY_END_INDICATOR}`); - const match = query.match(regex); - - return match && match[1] - ? match[1] - .split(',') - .filter(param => param !== '') - // Sanitize, as code could be injected with another rollup plugin - .map((str: string) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) - : []; + const wrapRegex = new RegExp( + `\\${SENTRY_WRAPPED_FUNCTIONS}(.*?)(\\${QUERY_END_INDICATOR}|\\${SENTRY_REEXPORTED_FUNCTIONS})`, + ); + // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor + const reexportRegex = new RegExp(`\\${SENTRY_REEXPORTED_FUNCTIONS}(.*?)(\\${QUERY_END_INDICATOR})`); + + const wrapMatch = query.match(wrapRegex); + const reexportMatch = query.match(reexportRegex); + + const wrap = + wrapMatch && wrapMatch[1] + ? wrapMatch[1] + .split(',') + .filter(param => param !== '') + .map((str: string) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) + : []; + + const reexport = + reexportMatch && reexportMatch[1] + ? reexportMatch[1] + .split(',') + .filter(param => param !== '' && param !== 'default') + .map((str: string) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) + : []; + + return { wrap, reexport }; } /** * Constructs a comma-separated string with all functions that need to be re-exported later from the server entry. * It uses Rollup's `exportedBindings` to determine the functions to re-export */ -export function constructFunctionsReExportQuery( +export function constructWrappedFunctionExportQuery( exportedBindings: Record | null, - asyncFunctionReExports: string[], + entrypointWrappedFunctions: string[], debug?: boolean, ): string { // `exportedBindings` can look like this: `{ '.': [ 'handler' ] }` or `{ '.': [], './firebase-gen-1.mjs': [ 'server' ] }` // The key `.` refers to exports within the current file, while other keys show from where exports were imported first. - const functionsToExport = flatten(Object.values(exportedBindings || {})).filter(functionName => - asyncFunctionReExports.includes(functionName), + const functionsToExport = flatten(Object.values(exportedBindings || {})).reduce( + (functions, currFunctionName) => { + if (entrypointWrappedFunctions.includes(currFunctionName)) { + functions.wrap.push(currFunctionName); + } else { + functions.reexport.push(currFunctionName); + } + return functions; + }, + { wrap: [], reexport: [] } as { wrap: string[]; reexport: string[] }, ); - if (debug && functionsToExport.length === 0) { + if (debug && functionsToExport.wrap.length === 0) { consoleSandbox(() => // eslint-disable-next-line no-console console.warn( - "[Sentry] No functions found for re-export. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.asyncFunctionReExports` in your `nuxt.config.ts`.", + "[Sentry] No functions found to wrap. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.entrypointWrappedFunctions` in your `nuxt.config.ts`.", ), ); } - return functionsToExport?.length ? SENTRY_FUNCTIONS_REEXPORT.concat(functionsToExport.join(',')) : ''; + const wrapQuery = functionsToExport.wrap.length + ? `${SENTRY_WRAPPED_FUNCTIONS}${functionsToExport.wrap.join(',')}` + : ''; + const reexportQuery = functionsToExport.reexport.length + ? `${SENTRY_REEXPORTED_FUNCTIONS}${functionsToExport.reexport.join(',')}` + : ''; + + return [wrapQuery, reexportQuery].filter(Boolean).join(''); } /** - * Constructs a code snippet with function reexports (can be used in Rollup plugins) + * Constructs a code snippet with function reexports (can be used in Rollup plugins as a return value for `load()`) */ export function constructFunctionReExport(pathWithQuery: string, entryId: string): string { - const functionNames = extractFunctionReexportQueryParameters(pathWithQuery); - - return functionNames.reduce( - (functionsCode, currFunctionName) => - functionsCode.concat( - `async function reExport${currFunctionName.toUpperCase()}(...args) {\n` + - ` const res = await import(${JSON.stringify(entryId)});\n` + - ` return res.${currFunctionName}.call(this, ...args);\n` + - '}\n' + - `export { reExport${currFunctionName.toUpperCase()} as ${currFunctionName} };\n`, + const { wrap: wrapFunctions, reexport: reexportFunctions } = extractFunctionReexportQueryParameters(pathWithQuery); + + return wrapFunctions + .reduce( + (functionsCode, currFunctionName) => + functionsCode.concat( + `async function ${currFunctionName}_sentryWrapped(...args) {\n` + + ` const res = await import(${JSON.stringify(entryId)});\n` + + ` return res.${currFunctionName}.call(this, ...args);\n` + + '}\n' + + `export { ${currFunctionName}_sentryWrapped as ${currFunctionName} };\n`, + ), + '', + ) + .concat( + reexportFunctions.reduce( + (functionsCode, currFunctionName) => + functionsCode.concat(`export { ${currFunctionName} } from ${JSON.stringify(entryId)};`), + '', ), - '', - ); + ); } diff --git a/packages/nuxt/test/vite/utils.test.ts b/packages/nuxt/test/vite/utils.test.ts index 20f8d6de2e62..5696d849ff28 100644 --- a/packages/nuxt/test/vite/utils.test.ts +++ b/packages/nuxt/test/vite/utils.test.ts @@ -2,10 +2,11 @@ import * as fs from 'fs'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { QUERY_END_INDICATOR, - SENTRY_FUNCTIONS_REEXPORT, + SENTRY_REEXPORTED_FUNCTIONS, SENTRY_WRAPPED_ENTRY, + SENTRY_WRAPPED_FUNCTIONS, constructFunctionReExport, - constructFunctionsReExportQuery, + constructWrappedFunctionExportQuery, extractFunctionReexportQueryParameters, findDefaultSdkInitFile, removeSentryQueryFromPath, @@ -71,7 +72,7 @@ describe('findDefaultSdkInitFile', () => { describe('removeSentryQueryFromPath', () => { it('strips the Sentry query part from the path', () => { - const url = `/example/path${SENTRY_WRAPPED_ENTRY}${SENTRY_FUNCTIONS_REEXPORT}foo,${QUERY_END_INDICATOR}`; + const url = `/example/path${SENTRY_WRAPPED_ENTRY}${SENTRY_WRAPPED_FUNCTIONS}foo,${QUERY_END_INDICATOR}`; const url2 = `/example/path${SENTRY_WRAPPED_ENTRY}${QUERY_END_INDICATOR}`; const result = removeSentryQueryFromPath(url); const result2 = removeSentryQueryFromPath(url2); @@ -88,33 +89,56 @@ describe('removeSentryQueryFromPath', () => { describe('extractFunctionReexportQueryParameters', () => { it.each([ - [`${SENTRY_FUNCTIONS_REEXPORT}foo,bar,${QUERY_END_INDICATOR}`, ['foo', 'bar']], - [`${SENTRY_FUNCTIONS_REEXPORT}foo,bar,default${QUERY_END_INDICATOR}`, ['foo', 'bar', 'default']], + [`${SENTRY_WRAPPED_FUNCTIONS}foo,bar,${QUERY_END_INDICATOR}`, { wrap: ['foo', 'bar'], reexport: [] }], [ - `${SENTRY_FUNCTIONS_REEXPORT}foo,a.b*c?d[e]f(g)h|i\\\\j(){hello},${QUERY_END_INDICATOR}`, - ['foo', 'a\\.b\\*c\\?d\\[e\\]f\\(g\\)h\\|i\\\\\\\\j\\(\\)\\{hello\\}'], + `${SENTRY_WRAPPED_FUNCTIONS}foo,bar,default${QUERY_END_INDICATOR}`, + { wrap: ['foo', 'bar', 'default'], reexport: [] }, ], - [`/example/path/${SENTRY_FUNCTIONS_REEXPORT}foo,bar${QUERY_END_INDICATOR}`, ['foo', 'bar']], - [`${SENTRY_FUNCTIONS_REEXPORT}${QUERY_END_INDICATOR}`, []], - ['?other-query=param', []], + [ + `${SENTRY_WRAPPED_FUNCTIONS}foo,a.b*c?d[e]f(g)h|i\\\\j(){hello},${QUERY_END_INDICATOR}`, + { wrap: ['foo', 'a\\.b\\*c\\?d\\[e\\]f\\(g\\)h\\|i\\\\\\\\j\\(\\)\\{hello\\}'], reexport: [] }, + ], + [`/example/path/${SENTRY_WRAPPED_FUNCTIONS}foo,bar${QUERY_END_INDICATOR}`, { wrap: ['foo', 'bar'], reexport: [] }], + [ + `${SENTRY_WRAPPED_FUNCTIONS}foo,bar,${SENTRY_REEXPORTED_FUNCTIONS}${QUERY_END_INDICATOR}`, + { wrap: ['foo', 'bar'], reexport: [] }, + ], + [`${SENTRY_REEXPORTED_FUNCTIONS}${QUERY_END_INDICATOR}`, { wrap: [], reexport: [] }], + [ + `/path${SENTRY_WRAPPED_FUNCTIONS}foo,bar${SENTRY_REEXPORTED_FUNCTIONS}bar${QUERY_END_INDICATOR}`, + { wrap: ['foo', 'bar'], reexport: ['bar'] }, + ], + ['?other-query=param', { wrap: [], reexport: [] }], ])('extracts parameters from the query string: %s', (query, expected) => { const result = extractFunctionReexportQueryParameters(query); expect(result).toEqual(expected); }); }); -describe('constructFunctionsReExportQuery', () => { +describe('constructWrappedFunctionExportQuery', () => { it.each([ - [{ '.': ['handler'] }, ['handler'], '?sentry-query-functions-reexport=handler'], - [{ '.': ['handler'], './module': ['server'] }, [], ''], - [{ '.': ['handler'], './module': ['server'] }, ['server'], '?sentry-query-functions-reexport=server'], - [{ '.': ['handler', 'otherFunction'] }, ['handler'], '?sentry-query-functions-reexport=handler'], - [{ '.': ['handler', 'otherFn'] }, ['handler', 'otherFn'], '?sentry-query-functions-reexport=handler,otherFn'], - [{ '.': ['bar'], './module': ['foo'] }, ['bar', 'foo'], '?sentry-query-functions-reexport=bar,foo'], + [{ '.': ['handler'] }, ['handler'], `${SENTRY_WRAPPED_FUNCTIONS}handler`], + [{ '.': ['handler'], './module': ['server'] }, [], `${SENTRY_REEXPORTED_FUNCTIONS}handler,server`], + [ + { '.': ['handler'], './module': ['server'] }, + ['server'], + `${SENTRY_WRAPPED_FUNCTIONS}server${SENTRY_REEXPORTED_FUNCTIONS}handler`, + ], + [ + { '.': ['handler', 'otherFunction'] }, + ['handler'], + `${SENTRY_WRAPPED_FUNCTIONS}handler${SENTRY_REEXPORTED_FUNCTIONS}otherFunction`, + ], + [{ '.': ['handler', 'otherFn'] }, ['handler', 'otherFn'], `${SENTRY_WRAPPED_FUNCTIONS}handler,otherFn`], + [{ '.': ['bar'], './module': ['foo'] }, ['bar', 'foo'], `${SENTRY_WRAPPED_FUNCTIONS}bar,foo`], + [{ '.': ['foo', 'bar'] }, ['foo'], `${SENTRY_WRAPPED_FUNCTIONS}foo${SENTRY_REEXPORTED_FUNCTIONS}bar`], + [{ '.': ['foo', 'bar'] }, ['bar'], `${SENTRY_WRAPPED_FUNCTIONS}bar${SENTRY_REEXPORTED_FUNCTIONS}foo`], + [{ '.': ['foo', 'bar'] }, ['foo', 'bar'], `${SENTRY_WRAPPED_FUNCTIONS}foo,bar`], + [{ '.': ['foo', 'bar'] }, [], `${SENTRY_REEXPORTED_FUNCTIONS}foo,bar`], ])( - 'constructs re-export query for exportedBindings: %j and asyncFunctionReExports: %j', - (exportedBindings, asyncFunctionReExports, expected) => { - const result = constructFunctionsReExportQuery(exportedBindings, asyncFunctionReExports); + 'constructs re-export query for exportedBindings: %j and entrypointWrappedFunctions: %j', + (exportedBindings, entrypointWrappedFunctions, expected) => { + const result = constructWrappedFunctionExportQuery(exportedBindings, entrypointWrappedFunctions); expect(result).toBe(expected); }, ); @@ -122,13 +146,13 @@ describe('constructFunctionsReExportQuery', () => { it('logs a warning if no functions are found for re-export and debug is true', () => { const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); const exportedBindings = { '.': ['handler'] }; - const asyncFunctionReExports = ['nonExistentFunction']; + const entrypointWrappedFunctions = ['nonExistentFunction']; const debug = true; - const result = constructFunctionsReExportQuery(exportedBindings, asyncFunctionReExports, debug); - expect(result).toBe(''); + const result = constructWrappedFunctionExportQuery(exportedBindings, entrypointWrappedFunctions, debug); + expect(result).toBe('?sentry-query-reexported-functions=handler'); expect(consoleWarnSpy).toHaveBeenCalledWith( - "[Sentry] No functions found for re-export. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.asyncFunctionReExports` in your `nuxt.config.ts`.", + "[Sentry] No functions found to wrap. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.entrypointWrappedFunctions` in your `nuxt.config.ts`.", ); consoleWarnSpy.mockRestore(); @@ -137,54 +161,85 @@ describe('constructFunctionsReExportQuery', () => { describe('constructFunctionReExport', () => { it('constructs re-export code for given query parameters and entry ID', () => { - const query = `${SENTRY_FUNCTIONS_REEXPORT}foo,bar,${QUERY_END_INDICATOR}}`; - const query2 = `${SENTRY_FUNCTIONS_REEXPORT}foo,bar${QUERY_END_INDICATOR}}`; + const query = `${SENTRY_WRAPPED_FUNCTIONS}foo,bar,${QUERY_END_INDICATOR}}`; + const query2 = `${SENTRY_WRAPPED_FUNCTIONS}foo,bar${QUERY_END_INDICATOR}}`; const entryId = './module'; const result = constructFunctionReExport(query, entryId); const result2 = constructFunctionReExport(query2, entryId); const expected = ` -async function reExportFOO(...args) { +async function foo_sentryWrapped(...args) { const res = await import("./module"); return res.foo.call(this, ...args); } -export { reExportFOO as foo }; -async function reExportBAR(...args) { +export { foo_sentryWrapped as foo }; +async function bar_sentryWrapped(...args) { const res = await import("./module"); return res.bar.call(this, ...args); } -export { reExportBAR as bar }; +export { bar_sentryWrapped as bar }; `; expect(result.trim()).toBe(expected.trim()); expect(result2.trim()).toBe(expected.trim()); }); it('constructs re-export code for a "default" query parameters and entry ID', () => { - const query = `${SENTRY_FUNCTIONS_REEXPORT}default${QUERY_END_INDICATOR}}`; + const query = `${SENTRY_WRAPPED_FUNCTIONS}default${QUERY_END_INDICATOR}}`; const entryId = './index'; const result = constructFunctionReExport(query, entryId); const expected = ` -async function reExportDEFAULT(...args) { +async function default_sentryWrapped(...args) { const res = await import("./index"); return res.default.call(this, ...args); } -export { reExportDEFAULT as default }; +export { default_sentryWrapped as default }; `; expect(result.trim()).toBe(expected.trim()); }); it('constructs re-export code for a "default" query parameters and entry ID', () => { - const query = `${SENTRY_FUNCTIONS_REEXPORT}default${QUERY_END_INDICATOR}}`; + const query = `${SENTRY_WRAPPED_FUNCTIONS}default${QUERY_END_INDICATOR}}`; const entryId = './index'; const result = constructFunctionReExport(query, entryId); const expected = ` -async function reExportDEFAULT(...args) { +async function default_sentryWrapped(...args) { const res = await import("./index"); return res.default.call(this, ...args); } -export { reExportDEFAULT as default }; +export { default_sentryWrapped as default }; +`; + expect(result.trim()).toBe(expected.trim()); + }); + + it('constructs re-export code for a mix of wrapped and re-exported functions', () => { + const query = `${SENTRY_WRAPPED_FUNCTIONS}foo,${SENTRY_REEXPORTED_FUNCTIONS}bar${QUERY_END_INDICATOR}`; + const entryId = './module'; + const result = constructFunctionReExport(query, entryId); + + const expected = ` +async function foo_sentryWrapped(...args) { + const res = await import("./module"); + return res.foo.call(this, ...args); +} +export { foo_sentryWrapped as foo }; +export { bar } from "./module"; +`; + expect(result.trim()).toBe(expected.trim()); + }); + + it('does not re-export a default export for regular re-exported functions', () => { + const query = `${SENTRY_WRAPPED_FUNCTIONS}foo${SENTRY_REEXPORTED_FUNCTIONS}default${QUERY_END_INDICATOR}`; + const entryId = './module'; + const result = constructFunctionReExport(query, entryId); + + const expected = ` +async function foo_sentryWrapped(...args) { + const res = await import("./module"); + return res.foo.call(this, ...args); +} +export { foo_sentryWrapped as foo }; `; expect(result.trim()).toBe(expected.trim()); }); From b8a73ca5bd9509b8d62366f2f996430f2156b568 Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 31 Oct 2024 13:26:19 +0100 Subject: [PATCH 11/31] reexport and wrap functions --- packages/nuxt/src/vite/utils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/vite/utils.ts b/packages/nuxt/src/vite/utils.ts index 8822ad0e6e8f..031031cdd4fe 100644 --- a/packages/nuxt/src/vite/utils.ts +++ b/packages/nuxt/src/vite/utils.ts @@ -44,9 +44,8 @@ export function removeSentryQueryFromPath(url: string): string { } /** - * Extracts and sanitizes function re-export query parameters from a query string. - * If it is a default export, it is not considered for re-exporting. This function is mostly relevant for re-exporting - * serverless `handler` functions. + * Extracts and sanitizes function re-export and function wrap query parameters from a query string. + * If it is a default export, it is not considered for re-exporting. * * Only exported for testing. */ @@ -83,7 +82,8 @@ export function extractFunctionReexportQueryParameters(query: string): { wrap: s /** * Constructs a comma-separated string with all functions that need to be re-exported later from the server entry. - * It uses Rollup's `exportedBindings` to determine the functions to re-export + * It uses Rollup's `exportedBindings` to determine the functions to re-export. Functions which should be wrapped + * (e.g. serverless handlers) are wrapped by Sentry. */ export function constructWrappedFunctionExportQuery( exportedBindings: Record | null, From d5c85cfeca36099bf7a6013b11b3ee1dc49a1e1d Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 31 Oct 2024 14:43:09 +0100 Subject: [PATCH 12/31] delete debug build --- packages/astro/debug-build.ts | 8 -------- packages/astro/src/server/middleware.ts | 5 +---- 2 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 packages/astro/debug-build.ts diff --git a/packages/astro/debug-build.ts b/packages/astro/debug-build.ts deleted file mode 100644 index 60aa50940582..000000000000 --- a/packages/astro/debug-build.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare const __DEBUG_BUILD__: boolean; - -/** - * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code. - * - * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking. - */ -export const DEBUG_BUILD = __DEBUG_BUILD__; diff --git a/packages/astro/src/server/middleware.ts b/packages/astro/src/server/middleware.ts index dedb0199f149..50c8e973adfe 100644 --- a/packages/astro/src/server/middleware.ts +++ b/packages/astro/src/server/middleware.ts @@ -22,7 +22,6 @@ import { winterCGRequestToRequestData, } from '@sentry/utils'; import type { APIContext, MiddlewareResponseHandler } from 'astro'; -import { DEBUG_BUILD } from '../../debug-build'; type MiddlewareOptions = { /** @@ -197,11 +196,9 @@ async function instrumentRequest( (async () => { // Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections. try { - DEBUG_BUILD && logger.log('Flushing events...'); await flush(2000); - DEBUG_BUILD && logger.log('Done flushing events'); } catch (e) { - DEBUG_BUILD && logger.log('Error while flushing events:\n', e); + logger.log('Error while flushing events:\n', e); } })(), ); From 989ee7749ed8fda1abe002ba48e787c7a0127421 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 31 Oct 2024 14:47:15 +0100 Subject: [PATCH 13/31] chore(dev-deps): Remove typedoc deps (#14150) We are not using them, so no need to include them. If/when we decide to use this again we can re-add them (in a current version). Also resolves a security warning for outdated marked dependency. --- package.json | 2 -- yarn.lock | 83 ++-------------------------------------------------- 2 files changed, 2 insertions(+), 83 deletions(-) diff --git a/package.json b/package.json index bee335619d24..ce3f91932c64 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,6 @@ "@rollup/pluginutils": "^5.1.0", "@size-limit/file": "~11.1.6", "@size-limit/webpack": "~11.1.6", - "@strictsoftware/typedoc-plugin-monorepo": "^0.3.1", "@types/jest": "^27.4.1", "@types/jsdom": "^21.1.6", "@types/node": "^14.18.0", @@ -131,7 +130,6 @@ "sucrase": "^3.35.0", "ts-jest": "^27.1.4", "ts-node": "10.9.1", - "typedoc": "^0.18.0", "typescript": "4.9.5", "vitest": "^1.6.0", "yalc": "^1.0.0-pre.53" diff --git a/yarn.lock b/yarn.lock index 0576ce8c71fd..33ab98c4609d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9048,13 +9048,6 @@ dependencies: "@testing-library/dom" "^9.3.1" -"@strictsoftware/typedoc-plugin-monorepo@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@strictsoftware/typedoc-plugin-monorepo/-/typedoc-plugin-monorepo-0.3.1.tgz#83a704bad2cf90a05f62f1c2587b0be09693a9a0" - integrity sha512-b7oolCeKZ40jyEfQrDd/Z216M5ZE4tRML0B0bV35tUIALoQsBBA7dz3Kr+X6DtbZA7FQmaqNGS6WAt7zxLL7wg== - dependencies: - highlight.js "^9.15.6" - "@sveltejs/kit@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-2.0.2.tgz#bd02523fe570ddaf89148bffb1eb2233c458054b" @@ -19566,7 +19559,7 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.7.3, handlebars@^4.7.6, handlebars@^4.7.7: +handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.7.3, handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -19943,16 +19936,6 @@ heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heim dependencies: rsvp "~3.2.1" -highlight.js@^10.0.0: - version "10.7.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.1.tgz#a8ec4152db24ea630c90927d6cae2a45f8ecb955" - integrity sha512-S6G97tHGqJ/U8DsXcEdnACbirtbx58Bx9CzIVeYli8OuswCfYI/LsXH2EiGcoGio1KAC3x4mmUwulOllJ2ZyRA== - -highlight.js@^9.15.6: - version "9.18.5" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" - integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== - "history-4@npm:history@4.6.0": version "4.6.0" resolved "https://registry.yarnpkg.com/history/-/history-4.6.0.tgz#2e09f7b173333040044c9fede373ad29bc2e2186" @@ -23058,11 +23041,6 @@ lru.min@^1.0.0: resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.1.tgz#146e01e3a183fa7ba51049175de04667d5701f0e" integrity sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q== -lunr@^2.3.8: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - luxon@^3.2.1, luxon@~3.4.0: version "3.4.4" resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" @@ -23355,11 +23333,6 @@ markdown-table@3.0.3, markdown-table@^3.0.0: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== -marked@^1.1.1: - version "1.2.9" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.9.tgz#53786f8b05d4c01a2a5a76b7d1ec9943d29d72dc" - integrity sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw== - matcher-collection@^1.0.0, matcher-collection@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" @@ -29867,7 +29840,7 @@ shell-quote@^1.7.3, shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -shelljs@^0.8.3, shelljs@^0.8.4: +shelljs@^0.8.3: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== @@ -31972,29 +31945,6 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typedoc-default-themes@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.10.2.tgz#743380a80afe62c5ef92ca1bd4abe2ac596be4d2" - integrity sha512-zo09yRj+xwLFE3hyhJeVHWRSPuKEIAsFK5r2u47KL/HBKqpwdUSanoaz5L34IKiSATFrjG5ywmIu98hPVMfxZg== - dependencies: - lunr "^2.3.8" - -typedoc@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.18.0.tgz#8bf53ddd7df5b8966b52c946929a09549d78682b" - integrity sha512-UgDQwapCGQCCdYhEQzQ+kGutmcedklilgUGf62Vw6RdI29u6FcfAXFQfRTiJEbf16aK3YnkB20ctQK1JusCRbA== - dependencies: - fs-extra "^9.0.1" - handlebars "^4.7.6" - highlight.js "^10.0.0" - lodash "^4.17.15" - lunr "^2.3.8" - marked "^1.1.1" - minimatch "^3.0.0" - progress "^2.0.3" - shelljs "^0.8.4" - typedoc-default-themes "^0.10.2" - typescript-memoize@^1.0.0-alpha.3, typescript-memoize@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" @@ -33538,35 +33488,6 @@ webpack@^5.95.0, webpack@~5.95.0: watchpack "^2.4.1" webpack-sources "^3.2.3" -webpack@~5.95.0: - version "5.95.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" - integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== - dependencies: - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" From 984a6bdceab56bf64a67d42fa4d457e3256020fc Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 31 Oct 2024 16:22:04 +0100 Subject: [PATCH 14/31] chore(dev-deps): Bump transitive dev dependencies (#14151) Bump some transitive dev dependencies to hopefully resolve (not actionable, but still) security warnings: * http-cache-semantics * mout * node-forge * chalk/ansi-regex * node-fetch * marked * send * serve-static --- packages/react/package.json | 4 +- yarn.lock | 111 ++++++++++++------------------------ 2 files changed, 38 insertions(+), 77 deletions(-) diff --git a/packages/react/package.json b/packages/react/package.json index a019238d5d48..b3260e24fc63 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -54,7 +54,7 @@ "@types/history-4": "npm:@types/history@4.7.8", "@types/history-5": "npm:@types/history@4.7.8", "@types/hoist-non-react-statics": "^3.3.5", - "@types/node-fetch": "^2.6.0", + "@types/node-fetch": "^2.6.11", "@types/react": "17.0.3", "@types/react-router-3": "npm:@types/react-router@3.0.24", "@types/react-router-4": "npm:@types/react-router@5.1.14", @@ -63,7 +63,7 @@ "eslint-plugin-react-hooks": "^4.0.8", "history-4": "npm:history@4.6.0", "history-5": "npm:history@4.9.0", - "node-fetch": "^2.6.0", + "node-fetch": "^2.6.7", "react": "^18.0.0", "react-dom": "^18.0.0", "react-router-3": "npm:react-router@3.2.0", diff --git a/yarn.lock b/yarn.lock index 33ab98c4609d..5229a7f9969b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -85,20 +85,13 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.0" - -"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== +"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.2.1": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@angular-devkit/architect@0.1402.13": version "0.1402.13" @@ -6342,14 +6335,6 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.0", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - "@jridgewell/trace-mapping@^0.3.17": version "0.3.19" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" @@ -6374,6 +6359,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@kwsites/file-exists@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" @@ -9913,13 +9906,13 @@ resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.11.tgz#70b7131f65038ae63cfe841354c8aba363632344" integrity sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg== -"@types/node-fetch@^2.6.0": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" - integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== +"@types/node-fetch@^2.6.11": + version "2.6.11" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== dependencies: "@types/node" "*" - form-data "^3.0.0" + form-data "^4.0.0" "@types/node-forge@^1.3.0": version "1.3.11" @@ -11506,7 +11499,7 @@ ansi-html-community@^0.0.8: ansi-html@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + integrity sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA== ansi-regex@^2.0.0: version "2.1.1" @@ -19438,11 +19431,11 @@ google-gax@^2.9.0, google-gax@^2.9.2: retry-request "^4.0.0" google-p12-pem@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.0.3.tgz#673ac3a75d3903a87f05878f3c75e06fc151669e" - integrity sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA== + version "3.1.4" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.4.tgz#123f7b40da204de4ed1fbf2fd5be12c047fc8b3b" + integrity sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg== dependencies: - node-forge "^0.10.0" + node-forge "^1.3.1" gopd@^1.0.1: version "1.0.1" @@ -20154,12 +20147,7 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-cache-semantics@^4.1.1: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -24441,9 +24429,9 @@ morgan@^1.10.0: on-headers "~1.0.2" mout@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/mout/-/mout-1.2.3.tgz#bd1477d8c7f2db5fcf43c91de30b6cc746b78e10" - integrity sha512-vtE+eZcSj/sBkIp6gxB87MznryWP+gHIp0XX9SKrzA5TAkvz6y7VTuNruBjYdJozd8NY5i9XVIsn8cn3SwNjzg== + version "1.2.4" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.2.4.tgz#9ffd261c4d6509e7ebcbf6b641a89b36ecdf8155" + integrity sha512-mZb9uOruMWgn/fw28DG4/yE3Kehfk1zKCLhuDU2O3vlKdnBBr4XaOCqVTflJ5aODavGUPqFHZgrFX3NJVuxGhQ== mpath@0.8.4: version "0.8.4" @@ -24917,7 +24905,7 @@ node-fetch-native@^1.6.1, node-fetch-native@^1.6.2, node-fetch-native@^1.6.3, no resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz#679fc8fd8111266d47d7e72c379f1bed9acff06e" integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== -node-fetch@2.6.7, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -24932,10 +24920,12 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-fetch@^2.3.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" node-forge@^1, node-forge@^1.3.1: version "1.3.1" @@ -29608,25 +29598,6 @@ semver@^7.6.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" @@ -29695,7 +29666,7 @@ serve-placeholder@^2.0.2: dependencies: defu "^6.1.4" -serve-static@1.16.2: +serve-static@1.16.2, serve-static@^1.15.0: version "1.16.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== @@ -29705,16 +29676,6 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" -serve-static@^1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - server-destroy@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" From 62e95b26e25d23ec7e08870842b675e3472c6138 Mon Sep 17 00:00:00 2001 From: s1gr1d Date: Thu, 31 Oct 2024 16:29:20 +0100 Subject: [PATCH 15/31] review suggestions --- packages/nuxt/src/common/types.ts | 4 ++-- packages/nuxt/src/vite/utils.ts | 6 ++++-- packages/nuxt/test/vite/utils.test.ts | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/nuxt/src/common/types.ts b/packages/nuxt/src/common/types.ts index 39158f28bb14..46f390120cfe 100644 --- a/packages/nuxt/src/common/types.ts +++ b/packages/nuxt/src/common/types.ts @@ -118,12 +118,12 @@ export type SentryNuxtModuleOptions = { dynamicImportForServerEntry?: boolean; /** - * By default—unless you configure `dynamicImportForServerEntry: false`—the SDK will try to wrap your application entrypoint + * By default—unless you configure `dynamicImportForServerEntry: false`—the SDK will try to wrap your Nitro server entrypoint * with a dynamic `import()` to ensure all dependencies can be properly instrumented. Any previous exports from the entrypoint are still exported. * Most exports of the server entrypoint are serverless functions and those are wrapped by Sentry. Other exports stay as-is. * * By default, the SDK will wrap the default export as well as a `handler` or `server` export from the entrypoint. - * If your application has a different main export that is used to run the application, you can overwrite this by providing an array of export names to wrap. + * If your server has a different main export that is used to run the server, you can overwrite this by providing an array of export names to wrap. * Any wrapped export is expected to be an async function. * * @default ['default', 'handler', 'server'] diff --git a/packages/nuxt/src/vite/utils.ts b/packages/nuxt/src/vite/utils.ts index 031031cdd4fe..8fffc8fe06c9 100644 --- a/packages/nuxt/src/vite/utils.ts +++ b/packages/nuxt/src/vite/utils.ts @@ -66,6 +66,7 @@ export function extractFunctionReexportQueryParameters(query: string): { wrap: s ? wrapMatch[1] .split(',') .filter(param => param !== '') + // Sanitize, as code could be injected with another rollup plugin .map((str: string) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) : []; @@ -74,6 +75,7 @@ export function extractFunctionReexportQueryParameters(query: string): { wrap: s ? reexportMatch[1] .split(',') .filter(param => param !== '' && param !== 'default') + // Sanitize, as code could be injected with another rollup plugin .map((str: string) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) : []; @@ -108,7 +110,7 @@ export function constructWrappedFunctionExportQuery( consoleSandbox(() => // eslint-disable-next-line no-console console.warn( - "[Sentry] No functions found to wrap. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.entrypointWrappedFunctions` in your `nuxt.config.ts`.", + "[Sentry] No functions found to wrap. In case the server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.entrypointWrappedFunctions` in `nuxt.config.ts`.", ), ); } @@ -120,7 +122,7 @@ export function constructWrappedFunctionExportQuery( ? `${SENTRY_REEXPORTED_FUNCTIONS}${functionsToExport.reexport.join(',')}` : ''; - return [wrapQuery, reexportQuery].filter(Boolean).join(''); + return [wrapQuery, reexportQuery].join(''); } /** diff --git a/packages/nuxt/test/vite/utils.test.ts b/packages/nuxt/test/vite/utils.test.ts index 5696d849ff28..a35f9cf8ca34 100644 --- a/packages/nuxt/test/vite/utils.test.ts +++ b/packages/nuxt/test/vite/utils.test.ts @@ -152,7 +152,7 @@ describe('constructWrappedFunctionExportQuery', () => { const result = constructWrappedFunctionExportQuery(exportedBindings, entrypointWrappedFunctions, debug); expect(result).toBe('?sentry-query-reexported-functions=handler'); expect(consoleWarnSpy).toHaveBeenCalledWith( - "[Sentry] No functions found to wrap. In case your server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.entrypointWrappedFunctions` in your `nuxt.config.ts`.", + "[Sentry] No functions found to wrap. In case the server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.entrypointWrappedFunctions` in `nuxt.config.ts`.", ); consoleWarnSpy.mockRestore(); From 738870d3209ebed82b1dec8f3ec52262f0bb0904 Mon Sep 17 00:00:00 2001 From: Sigrid Huemer <32902192+s1gr1d@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:46:58 +0100 Subject: [PATCH 16/31] feat(nuxt): Add `piniaIntegration` (#14138) After reverting https://github.com/getsentry/sentry-javascript/pull/14134, this is a more bundle-size friendly way of adding monitoring for Pinia in Nuxt. The Nuxt SDK now allows you to track Pinia state for captured errors. To enable the Pinia plugin, add the `piniaIntegration` to your client config: ```ts // sentry.client.config.ts import { usePinia } from '#imports'; Sentry.init({ integrations: [ Sentry.piniaIntegration(usePinia(), { /* optional Pinia plugin options */ }), ], }); --- CHANGELOG.md | 17 +++++ .../nuxt-4/app/pages/pinia-cart.vue | 73 +++++++++++++++++++ .../test-applications/nuxt-4/nuxt.config.ts | 2 +- .../test-applications/nuxt-4/package.json | 1 + .../nuxt-4/sentry.client.config.ts | 11 ++- .../test-applications/nuxt-4/stores/cart.ts | 43 +++++++++++ .../nuxt-4/tests/pinia.test.ts | 35 +++++++++ packages/nuxt/src/client/index.ts | 1 + packages/nuxt/src/client/piniaIntegration.ts | 39 ++++++++++ 9 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 dev-packages/e2e-tests/test-applications/nuxt-4/app/pages/pinia-cart.vue create mode 100644 dev-packages/e2e-tests/test-applications/nuxt-4/stores/cart.ts create mode 100644 dev-packages/e2e-tests/test-applications/nuxt-4/tests/pinia.test.ts create mode 100644 packages/nuxt/src/client/piniaIntegration.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index b160a8e17293..31db2ef30b12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,23 @@ - "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott +- **feat(nuxt): Add `piniaIntegration` ([#14138](https://github.com/getsentry/sentry-javascript/pull/14138))** + +The Nuxt SDK now allows you to track Pinia state for captured errors. To enable the Pinia plugin, add the `piniaIntegration` to your client config: + +```ts +// sentry.client.config.ts +import { usePinia } from '#imports'; + +Sentry.init({ + integrations: [ + Sentry.piniaIntegration(usePinia(), { + /* optional Pinia plugin options */ + }), + ], +}); +``` + ## 8.36.0 ### Important Changes diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/app/pages/pinia-cart.vue b/dev-packages/e2e-tests/test-applications/nuxt-4/app/pages/pinia-cart.vue new file mode 100644 index 000000000000..3d210cf459de --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/app/pages/pinia-cart.vue @@ -0,0 +1,73 @@ + + + + + + + diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/nuxt.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-4/nuxt.config.ts index c00ba0d5d9ed..da988a9ee003 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-4/nuxt.config.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/nuxt.config.ts @@ -4,7 +4,7 @@ export default defineNuxtConfig({ compatibilityDate: '2024-04-03', imports: { autoImport: false }, - modules: ['@sentry/nuxt/module'], + modules: ['@pinia/nuxt', '@sentry/nuxt/module'], runtimeConfig: { public: { diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/package.json b/dev-packages/e2e-tests/test-applications/nuxt-4/package.json index db56273a7493..178804768e87 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-4/package.json +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/package.json @@ -14,6 +14,7 @@ "test:assert": "pnpm test" }, "dependencies": { + "@pinia/nuxt": "^0.5.5", "@sentry/nuxt": "latest || *", "nuxt": "^3.13.2" }, diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/sentry.client.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-4/sentry.client.config.ts index 7547bafa6618..dd2183162db9 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-4/sentry.client.config.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/sentry.client.config.ts @@ -1,5 +1,5 @@ import * as Sentry from '@sentry/nuxt'; -import { useRuntimeConfig } from '#imports'; +import { usePinia, useRuntimeConfig } from '#imports'; Sentry.init({ environment: 'qa', // dynamic sampling bias to keep transactions @@ -7,4 +7,13 @@ Sentry.init({ tunnel: `http://localhost:3031/`, // proxy server tracesSampleRate: 1.0, trackComponents: true, + integrations: [ + Sentry.piniaIntegration(usePinia(), { + actionTransformer: action => `Transformed: ${action}`, + stateTransformer: state => ({ + transformed: true, + ...state, + }), + }), + ], }); diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/stores/cart.ts b/dev-packages/e2e-tests/test-applications/nuxt-4/stores/cart.ts new file mode 100644 index 000000000000..cad52916ac25 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/stores/cart.ts @@ -0,0 +1,43 @@ +import { acceptHMRUpdate, defineStore } from '#imports'; + +export const useCartStore = defineStore({ + id: 'cart', + state: () => ({ + rawItems: [] as string[], + }), + getters: { + items: (state): Array<{ name: string; amount: number }> => + state.rawItems.reduce( + (items: any, item: any) => { + const existingItem = items.find((it: any) => it.name === item); + + if (!existingItem) { + items.push({ name: item, amount: 1 }); + } else { + existingItem.amount++; + } + + return items; + }, + [] as Array<{ name: string; amount: number }>, + ), + }, + actions: { + addItem(name: string) { + this.rawItems.push(name); + }, + + removeItem(name: string) { + const i = this.rawItems.lastIndexOf(name); + if (i > -1) this.rawItems.splice(i, 1); + }, + + throwError() { + throw new Error('error'); + }, + }, +}); + +if (import.meta.hot) { + import.meta.hot.accept(acceptHMRUpdate(useCartStore, import.meta.hot)); +} diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/tests/pinia.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-4/tests/pinia.test.ts new file mode 100644 index 000000000000..44b057a29f15 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/tests/pinia.test.ts @@ -0,0 +1,35 @@ +import { expect, test } from '@playwright/test'; +import { waitForError } from '@sentry-internal/test-utils'; + +test('sends pinia action breadcrumbs and state context', async ({ page }) => { + await page.goto('/pinia-cart'); + + await page.locator('#item-input').fill('item'); + await page.locator('#item-add').click(); + + const errorPromise = waitForError('nuxt-4', async errorEvent => { + return errorEvent?.exception?.values?.[0].value === 'This is an error'; + }); + + await page.locator('#throw-error').click(); + + const error = await errorPromise; + + expect(error).toBeTruthy(); + expect(error.breadcrumbs?.length).toBeGreaterThan(0); + + const actionBreadcrumb = error.breadcrumbs?.find(breadcrumb => breadcrumb.category === 'action'); + + expect(actionBreadcrumb).toBeDefined(); + expect(actionBreadcrumb?.message).toBe('Transformed: addItem'); + expect(actionBreadcrumb?.level).toBe('info'); + + const stateContext = error.contexts?.state?.state; + + expect(stateContext).toBeDefined(); + expect(stateContext?.type).toBe('pinia'); + expect(stateContext?.value).toEqual({ + transformed: true, + rawItems: ['item'], + }); +}); diff --git a/packages/nuxt/src/client/index.ts b/packages/nuxt/src/client/index.ts index 583643fa40f1..849c305a22e3 100644 --- a/packages/nuxt/src/client/index.ts +++ b/packages/nuxt/src/client/index.ts @@ -1,3 +1,4 @@ export * from '@sentry/vue'; export { init } from './sdk'; +export { piniaIntegration } from './piniaIntegration'; diff --git a/packages/nuxt/src/client/piniaIntegration.ts b/packages/nuxt/src/client/piniaIntegration.ts new file mode 100644 index 000000000000..28b797fb9fa6 --- /dev/null +++ b/packages/nuxt/src/client/piniaIntegration.ts @@ -0,0 +1,39 @@ +import { defineIntegration } from '@sentry/core'; +import type { IntegrationFn } from '@sentry/types'; + +import { consoleSandbox } from '@sentry/utils'; +import { createSentryPiniaPlugin } from '@sentry/vue'; + +const INTEGRATION_NAME = 'Pinia'; + +type Pinia = { use: (plugin: ReturnType) => void }; + +const _piniaIntegration = (( + // `unknown` here as well because usePinia declares this type: `export declare const usePinia: () => unknown;` + pinia: unknown | Pinia, + options: Parameters[0] = {}, +) => { + return { + name: INTEGRATION_NAME, + setup() { + if (!pinia || (typeof pinia === 'object' && !('use' in pinia))) { + consoleSandbox(() => { + // eslint-disable-next-line no-console + console.warn( + '[Sentry] The Pinia integration was added, but the passed parameter `pinia` has the wrong value. Make sure to enable Pinia by adding `"@pinia/nuxt"` to the Nuxt modules array and pass pinia to Sentry with `piniaIntegration(usePinia())`. Current value of `pinia`:', + pinia, + ); + }); + } else { + (pinia as Pinia).use(createSentryPiniaPlugin(options)); + } + }, + }; +}) satisfies IntegrationFn; + +/** + * Monitor an existing Pinia store. + * + * This only works if "@pinia/nuxt" is added to the `modules` array. + */ +export const piniaIntegration = defineIntegration(_piniaIntegration); From 6729214ab7963071c54b28fbaee737a2f306e33d Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Mon, 4 Nov 2024 12:41:45 +0100 Subject: [PATCH 17/31] fix(core): Silently fail maybeInstrument (#14140) Co-authored-by: Francesco Novy --- .size-limit.js | 2 +- packages/utils/src/instrument/handlers.ts | 6 +++++- packages/utils/test/instrument.test.ts | 13 +++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 packages/utils/test/instrument.test.ts diff --git a/.size-limit.js b/.size-limit.js index 75545fd89194..cd2a3630ef5c 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -224,7 +224,7 @@ module.exports = [ import: createImport('init'), ignore: ['next/router', 'next/constants'], gzip: true, - limit: '39.1 KB', + limit: '40 KB', }, // SvelteKit SDK (ESM) { diff --git a/packages/utils/src/instrument/handlers.ts b/packages/utils/src/instrument/handlers.ts index b22f01318b0a..672c819e17a6 100644 --- a/packages/utils/src/instrument/handlers.ts +++ b/packages/utils/src/instrument/handlers.ts @@ -37,8 +37,12 @@ export function resetInstrumentationHandlers(): void { /** Maybe run an instrumentation function, unless it was already called. */ export function maybeInstrument(type: InstrumentHandlerType, instrumentFn: () => void): void { if (!instrumented[type]) { - instrumentFn(); instrumented[type] = true; + try { + instrumentFn(); + } catch (e) { + DEBUG_BUILD && logger.error(`Error while instrumenting ${type}`, e); + } } } diff --git a/packages/utils/test/instrument.test.ts b/packages/utils/test/instrument.test.ts new file mode 100644 index 000000000000..440a19121a1a --- /dev/null +++ b/packages/utils/test/instrument.test.ts @@ -0,0 +1,13 @@ +import { maybeInstrument } from '../src'; + +describe('maybeInstrument', () => { + test('does not throw when instrumenting fails', () => { + maybeInstrument('xhr', () => { + throw new Error('test'); + }); + }); + + test('does not throw when instrumenting fn is not a function', () => { + maybeInstrument('xhr', undefined as any); + }); +}); From 3f953f9d7d4149330c5c13ef36cf075c478ce573 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 4 Nov 2024 13:14:28 -0500 Subject: [PATCH 18/31] fix(node): Make sure modulesIntegration does not crash esm apps (#14169) resolves https://github.com/getsentry/sentry-javascript/issues/12500 resolves https://github.com/getsentry/sentry-javascript/issues/14165 `modulesIntegration` uses top-level require which will crash ESM apps if you explicitly import and use the integration. ```mjs // index.mjs Sentry.init({ dsn: '__DSN__', integrations: [ Sentry.modulesIntegration(), ] }); ``` This fixes that by adding a boolean check for cjs apps, and logging out a warning as a result. --- .../suites/esm/modules-integration/app.mjs | 10 ++++++++++ .../suites/esm/modules-integration/test.ts | 12 ++++++++++++ packages/node/src/integrations/modules.ts | 16 ++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 dev-packages/node-integration-tests/suites/esm/modules-integration/app.mjs create mode 100644 dev-packages/node-integration-tests/suites/esm/modules-integration/test.ts diff --git a/dev-packages/node-integration-tests/suites/esm/modules-integration/app.mjs b/dev-packages/node-integration-tests/suites/esm/modules-integration/app.mjs new file mode 100644 index 000000000000..7f4316dce907 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/esm/modules-integration/app.mjs @@ -0,0 +1,10 @@ +import { loggingTransport } from '@sentry-internal/node-integration-tests'; +import * as Sentry from '@sentry/node'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + autoSessionTracking: false, + integrations: [Sentry.modulesIntegration()], + transport: loggingTransport, +}); diff --git a/dev-packages/node-integration-tests/suites/esm/modules-integration/test.ts b/dev-packages/node-integration-tests/suites/esm/modules-integration/test.ts new file mode 100644 index 000000000000..556ec1d52a57 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/esm/modules-integration/test.ts @@ -0,0 +1,12 @@ +import { conditionalTest } from '../../../utils'; +import { cleanupChildProcesses, createRunner } from '../../../utils/runner'; + +afterAll(() => { + cleanupChildProcesses(); +}); + +conditionalTest({ min: 18 })('modulesIntegration', () => { + test('does not crash ESM setups', done => { + createRunner(__dirname, 'app.mjs').ensureNoErrorOutput().start(done); + }); +}); diff --git a/packages/node/src/integrations/modules.ts b/packages/node/src/integrations/modules.ts index b1b56c6c1fda..f434319b5bae 100644 --- a/packages/node/src/integrations/modules.ts +++ b/packages/node/src/integrations/modules.ts @@ -2,12 +2,26 @@ import { existsSync, readFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { defineIntegration } from '@sentry/core'; import type { IntegrationFn } from '@sentry/types'; +import { logger } from '@sentry/utils'; +import { DEBUG_BUILD } from '../debug-build'; +import { isCjs } from '../utils/commonjs'; let moduleCache: { [key: string]: string }; const INTEGRATION_NAME = 'Modules'; const _modulesIntegration = (() => { + // This integration only works in CJS contexts + if (!isCjs()) { + DEBUG_BUILD && + logger.warn( + 'modulesIntegration only works in CommonJS (CJS) environments. Remove this integration if you are using ESM.', + ); + return { + name: INTEGRATION_NAME, + }; + } + return { name: INTEGRATION_NAME, processEvent(event) { @@ -23,6 +37,8 @@ const _modulesIntegration = (() => { /** * Add node modules / packages to the event. + * + * Only works in CommonJS (CJS) environments. */ export const modulesIntegration = defineIntegration(_modulesIntegration); From 7f7f12e2d0a21bbe8b039481efb50c17239dcf5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:16:17 +0000 Subject: [PATCH 19/31] feat(deps): bump @opentelemetry/instrumentation-fastify from 0.40.0 to 0.41.0 (#14175) --- packages/node/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/node/package.json b/packages/node/package.json index 9b912bb3ede6..073dca72ac02 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -73,7 +73,7 @@ "@opentelemetry/instrumentation-connect": "0.40.0", "@opentelemetry/instrumentation-dataloader": "0.12.0", "@opentelemetry/instrumentation-express": "0.44.0", - "@opentelemetry/instrumentation-fastify": "0.40.0", + "@opentelemetry/instrumentation-fastify": "0.41.0", "@opentelemetry/instrumentation-fs": "0.16.0", "@opentelemetry/instrumentation-generic-pool": "0.39.0", "@opentelemetry/instrumentation-graphql": "0.43.0", diff --git a/yarn.lock b/yarn.lock index 5229a7f9969b..8a05bb0126bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7365,13 +7365,13 @@ "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" -"@opentelemetry/instrumentation-fastify@0.40.0": - version "0.40.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz#0c57608ac202337d56b53338f1fc9369d224306b" - integrity sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg== +"@opentelemetry/instrumentation-fastify@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.41.0.tgz#5e1d00383756f3a8cc2ea4a9d15f9f7510cec571" + integrity sha512-pNRjFvf0mvqfJueaeL/qEkuGJwgtE5pgjIHGYwjc2rMViNCrtY9/Sf+Nu8ww6dDd/Oyk2fwZZP7i0XZfCnETrA== dependencies: "@opentelemetry/core" "^1.8.0" - "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@opentelemetry/instrumentation-fs@0.16.0": From 0e474f64a42ea8721da10237f7c806b41ecd09ff Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 4 Nov 2024 13:30:31 -0500 Subject: [PATCH 20/31] feat: Deprecate metrics API (#14157) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The metrics beta has ended, so we are deprecating the metrics API. 🫡 --- .size-limit.js | 14 ------------- packages/astro/src/index.server.ts | 1 + packages/astro/src/index.types.ts | 1 + packages/aws-serverless/src/index.ts | 1 + packages/browser/src/metrics.ts | 20 +++++++++++++----- packages/bun/src/index.ts | 1 + packages/cloudflare/src/index.ts | 1 + packages/core/src/index.ts | 2 ++ packages/core/src/metrics/aggregator.ts | 1 + packages/core/src/metrics/exports-default.ts | 21 ++++++++++++++----- packages/core/src/metrics/exports.ts | 17 ++++++++++----- packages/core/test/lib/metrics/timing.test.ts | 1 + packages/deno/src/index.ts | 1 + packages/deno/src/sdk.ts | 1 - packages/google-cloud-serverless/src/index.ts | 1 + packages/nextjs/src/index.types.ts | 1 + packages/node/src/index.ts | 1 + packages/nuxt/src/index.types.ts | 1 + packages/remix/src/index.server.ts | 1 + packages/remix/src/index.types.ts | 1 + packages/solidstart/src/index.types.ts | 1 + packages/solidstart/src/server/index.ts | 1 + packages/sveltekit/src/index.types.ts | 1 + packages/sveltekit/src/server/index.ts | 1 + packages/vercel-edge/src/index.ts | 1 + 25 files changed, 64 insertions(+), 30 deletions(-) diff --git a/.size-limit.js b/.size-limit.js index cd2a3630ef5c..0030dc3afe7f 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -88,20 +88,6 @@ module.exports = [ gzip: true, limit: '95 KB', }, - { - name: '@sentry/browser (incl. Tracing, Replay, Feedback, metrics)', - path: 'packages/browser/build/npm/esm/index.js', - import: createImport('init', 'browserTracingIntegration', 'replayIntegration', 'feedbackIntegration', 'metrics'), - gzip: true, - limit: '100 KB', - }, - { - name: '@sentry/browser (incl. metrics)', - path: 'packages/browser/build/npm/esm/index.js', - import: createImport('init', 'metrics'), - gzip: true, - limit: '30 KB', - }, { name: '@sentry/browser (incl. Feedback)', path: 'packages/browser/build/npm/esm/index.js', diff --git a/packages/astro/src/index.server.ts b/packages/astro/src/index.server.ts index b544b71087fc..27d83ce7980b 100644 --- a/packages/astro/src/index.server.ts +++ b/packages/astro/src/index.server.ts @@ -74,6 +74,7 @@ export { localVariablesIntegration, lruMemoizerIntegration, makeNodeTransport, + // eslint-disable-next-line deprecation/deprecation metrics, modulesIntegration, mongoIntegration, diff --git a/packages/astro/src/index.types.ts b/packages/astro/src/index.types.ts index f30357a91c4a..c05cfb4a3215 100644 --- a/packages/astro/src/index.types.ts +++ b/packages/astro/src/index.types.ts @@ -32,5 +32,6 @@ export declare const continueTrace: typeof clientSdk.continueTrace; export declare const Span: clientSdk.Span; +// eslint-disable-next-line deprecation/deprecation export declare const metrics: typeof clientSdk.metrics & typeof serverSdk; export default sentryAstro; diff --git a/packages/aws-serverless/src/index.ts b/packages/aws-serverless/src/index.ts index cc7f783c40fd..faa43522f2fc 100644 --- a/packages/aws-serverless/src/index.ts +++ b/packages/aws-serverless/src/index.ts @@ -73,6 +73,7 @@ export { continueTrace, getAutoPerformanceIntegrations, cron, + // eslint-disable-next-line deprecation/deprecation metrics, parameterize, SEMANTIC_ATTRIBUTE_SENTRY_OP, diff --git a/packages/browser/src/metrics.ts b/packages/browser/src/metrics.ts index 39529af3e4a0..00d73ec33b1c 100644 --- a/packages/browser/src/metrics.ts +++ b/packages/browser/src/metrics.ts @@ -4,36 +4,40 @@ import type { DurationUnit, MetricData, Metrics } from '@sentry/types'; /** * Adds a value to a counter metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function increment(name: string, value: number = 1, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.increment(BrowserMetricsAggregator, name, value, data); } /** * Adds a value to a distribution metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function distribution(name: string, value: number, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.distribution(BrowserMetricsAggregator, name, value, data); } /** * Adds a value to a set metric. Value must be a string or integer. * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function set(name: string, value: number | string, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.set(BrowserMetricsAggregator, name, value, data); } /** * Adds a value to a gauge metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function gauge(name: string, value: number, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.gauge(BrowserMetricsAggregator, name, value, data); } @@ -44,7 +48,7 @@ function gauge(name: string, value: number, data?: MetricData): void { * You can either directly capture a numeric `value`, or wrap a callback function in `timing`. * In the latter case, the duration of the callback execution will be captured as a span & a metric. * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function timing(name: string, value: number, unit?: DurationUnit, data?: Omit): void; function timing(name: string, callback: () => T, unit?: DurationUnit, data?: Omit): T; @@ -54,9 +58,15 @@ function timing( unit: DurationUnit = 'second', data?: Omit, ): T | void { + // eslint-disable-next-line deprecation/deprecation return metricsCore.timing(BrowserMetricsAggregator, name, value, unit, data); } +/** + * The metrics API is used to capture custom metrics in Sentry. + * + * @deprecated The Sentry metrics beta has ended. This export will be removed in a future release. + */ export const metrics: Metrics = { increment, distribution, diff --git a/packages/bun/src/index.ts b/packages/bun/src/index.ts index 7ccca26a3da6..4d8e9fbb1310 100644 --- a/packages/bun/src/index.ts +++ b/packages/bun/src/index.ts @@ -94,6 +94,7 @@ export { continueTrace, getAutoPerformanceIntegrations, cron, + // eslint-disable-next-line deprecation/deprecation metrics, parameterize, SEMANTIC_ATTRIBUTE_SENTRY_OP, diff --git a/packages/cloudflare/src/index.ts b/packages/cloudflare/src/index.ts index 7c0aa6018313..fa0d76a54521 100644 --- a/packages/cloudflare/src/index.ts +++ b/packages/cloudflare/src/index.ts @@ -65,6 +65,7 @@ export { withActiveSpan, getSpanDescendants, continueTrace, + // eslint-disable-next-line deprecation/deprecation metrics, functionToStringIntegration, inboundFiltersIntegration, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 24cea1bea7ca..598b0168f3ef 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -99,9 +99,11 @@ export { rewriteFramesIntegration } from './integrations/rewriteframes'; export { sessionTimingIntegration } from './integrations/sessiontiming'; export { zodErrorsIntegration } from './integrations/zoderrors'; export { thirdPartyErrorFilterIntegration } from './integrations/third-party-errors-filter'; +// eslint-disable-next-line deprecation/deprecation export { metrics } from './metrics/exports'; export { profiler } from './profiling'; export type { MetricData } from '@sentry/types'; +// eslint-disable-next-line deprecation/deprecation export { metricsDefault } from './metrics/exports-default'; export { BrowserMetricsAggregator } from './metrics/browser-aggregator'; export { getMetricSummaryJsonForSpan } from './metrics/metric-summary'; diff --git a/packages/core/src/metrics/aggregator.ts b/packages/core/src/metrics/aggregator.ts index 8752d2a10df7..c87fd14e34f9 100644 --- a/packages/core/src/metrics/aggregator.ts +++ b/packages/core/src/metrics/aggregator.ts @@ -40,6 +40,7 @@ export class MetricsAggregator implements MetricsAggregatorBase { this._buckets = new Map(); this._bucketsTotalWeight = 0; + // eslint-disable-next-line @typescript-eslint/no-explicit-any this._interval = setInterval(() => this._flush(), DEFAULT_FLUSH_INTERVAL) as any; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (this._interval.unref) { diff --git a/packages/core/src/metrics/exports-default.ts b/packages/core/src/metrics/exports-default.ts index 1e4a6487b9a2..7a271696f025 100644 --- a/packages/core/src/metrics/exports-default.ts +++ b/packages/core/src/metrics/exports-default.ts @@ -11,36 +11,40 @@ import { metrics as metricsCore } from './exports'; /** * Adds a value to a counter metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function increment(name: string, value: number = 1, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.increment(MetricsAggregator, name, value, data); } /** * Adds a value to a distribution metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function distribution(name: string, value: number, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.distribution(MetricsAggregator, name, value, data); } /** * Adds a value to a set metric. Value must be a string or integer. * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function set(name: string, value: number | string, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.set(MetricsAggregator, name, value, data); } /** * Adds a value to a gauge metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function gauge(name: string, value: number, data?: MetricData): void { + // eslint-disable-next-line deprecation/deprecation metricsCore.gauge(MetricsAggregator, name, value, data); } @@ -51,7 +55,7 @@ function gauge(name: string, value: number, data?: MetricData): void { * You can either directly capture a numeric `value`, or wrap a callback function in `timing`. * In the latter case, the duration of the callback execution will be captured as a span & a metric. * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function timing(name: string, value: number, unit?: DurationUnit, data?: Omit): void; function timing(name: string, callback: () => T, unit?: DurationUnit, data?: Omit): T; @@ -61,6 +65,7 @@ function timing( unit: DurationUnit = 'second', data?: Omit, ): T | void { + // eslint-disable-next-line deprecation/deprecation return metricsCore.timing(MetricsAggregator, name, value, unit, data); } @@ -68,9 +73,15 @@ function timing( * Returns the metrics aggregator for a given client. */ function getMetricsAggregatorForClient(client: Client): MetricsAggregatorInterface { + // eslint-disable-next-line deprecation/deprecation return metricsCore.getMetricsAggregatorForClient(client, MetricsAggregator); } +/** + * The metrics API is used to capture custom metrics in Sentry. + * + * @deprecated The Sentry metrics beta has ended. This export will be removed in a future release. + */ export const metricsDefault: Metrics & { getMetricsAggregatorForClient: typeof getMetricsAggregatorForClient; } = { diff --git a/packages/core/src/metrics/exports.ts b/packages/core/src/metrics/exports.ts index 752471856153..2b3cdbcef8ba 100644 --- a/packages/core/src/metrics/exports.ts +++ b/packages/core/src/metrics/exports.ts @@ -78,7 +78,7 @@ function addToMetricsAggregator( /** * Adds a value to a counter metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function increment(aggregator: MetricsAggregatorConstructor, name: string, value: number = 1, data?: MetricData): void { addToMetricsAggregator(aggregator, COUNTER_METRIC_TYPE, name, ensureNumber(value), data); @@ -87,7 +87,7 @@ function increment(aggregator: MetricsAggregatorConstructor, name: string, value /** * Adds a value to a distribution metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function distribution(aggregator: MetricsAggregatorConstructor, name: string, value: number, data?: MetricData): void { addToMetricsAggregator(aggregator, DISTRIBUTION_METRIC_TYPE, name, ensureNumber(value), data); @@ -100,7 +100,7 @@ function distribution(aggregator: MetricsAggregatorConstructor, name: string, va * You can either directly capture a numeric `value`, or wrap a callback function in `timing`. * In the latter case, the duration of the callback execution will be captured as a span & a metric. * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function timing( aggregator: MetricsAggregatorConstructor, @@ -129,6 +129,7 @@ function timing( () => { const endTime = timestampInSeconds(); const timeDiff = endTime - startTime; + // eslint-disable-next-line deprecation/deprecation distribution(aggregator, name, timeDiff, { ...data, unit: 'second' }); span.end(endTime); }, @@ -138,13 +139,14 @@ function timing( } // value form + // eslint-disable-next-line deprecation/deprecation distribution(aggregator, name, value, { ...data, unit }); } /** * Adds a value to a set metric. Value must be a string or integer. * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function set(aggregator: MetricsAggregatorConstructor, name: string, value: number | string, data?: MetricData): void { addToMetricsAggregator(aggregator, SET_METRIC_TYPE, name, value, data); @@ -153,12 +155,17 @@ function set(aggregator: MetricsAggregatorConstructor, name: string, value: numb /** * Adds a value to a gauge metric * - * @experimental This API is experimental and might have breaking changes in the future. + * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release. */ function gauge(aggregator: MetricsAggregatorConstructor, name: string, value: number, data?: MetricData): void { addToMetricsAggregator(aggregator, GAUGE_METRIC_TYPE, name, ensureNumber(value), data); } +/** + * The metrics API is used to capture custom metrics in Sentry. + * + * @deprecated The Sentry metrics beta has ended. This export will be removed in a future release. + */ export const metrics = { increment, distribution, diff --git a/packages/core/test/lib/metrics/timing.test.ts b/packages/core/test/lib/metrics/timing.test.ts index fa7c9f88da77..3e48047c9175 100644 --- a/packages/core/test/lib/metrics/timing.test.ts +++ b/packages/core/test/lib/metrics/timing.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable deprecation/deprecation */ import { getCurrentScope, getIsolationScope, setCurrentClient } from '../../../src'; import { MetricsAggregator } from '../../../src/metrics/aggregator'; import { metrics as metricsCore } from '../../../src/metrics/exports'; diff --git a/packages/deno/src/index.ts b/packages/deno/src/index.ts index 8a0a2a49fdcc..c7328c810f92 100644 --- a/packages/deno/src/index.ts +++ b/packages/deno/src/index.ts @@ -62,6 +62,7 @@ export { startSpanManual, startNewTrace, suppressTracing, + // eslint-disable-next-line deprecation/deprecation metricsDefault as metrics, inboundFiltersIntegration, linkedErrorsIntegration, diff --git a/packages/deno/src/sdk.ts b/packages/deno/src/sdk.ts index c2a459b4db33..4072196c721f 100644 --- a/packages/deno/src/sdk.ts +++ b/packages/deno/src/sdk.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/consistent-type-imports */ import type { ServerRuntimeClientOptions } from '@sentry/core'; import { dedupeIntegration, diff --git a/packages/google-cloud-serverless/src/index.ts b/packages/google-cloud-serverless/src/index.ts index 80dba64cef97..6bb4bbcd30a7 100644 --- a/packages/google-cloud-serverless/src/index.ts +++ b/packages/google-cloud-serverless/src/index.ts @@ -74,6 +74,7 @@ export { continueTrace, getAutoPerformanceIntegrations, cron, + // eslint-disable-next-line deprecation/deprecation metrics, parameterize, SEMANTIC_ATTRIBUTE_SENTRY_OP, diff --git a/packages/nextjs/src/index.types.ts b/packages/nextjs/src/index.types.ts index 8f09999ad738..636d6c49815a 100644 --- a/packages/nextjs/src/index.types.ts +++ b/packages/nextjs/src/index.types.ts @@ -36,6 +36,7 @@ export declare const createReduxEnhancer: typeof clientSdk.createReduxEnhancer; export declare const showReportDialog: typeof clientSdk.showReportDialog; export declare const withErrorBoundary: typeof clientSdk.withErrorBoundary; +// eslint-disable-next-line deprecation/deprecation export declare const metrics: typeof clientSdk.metrics & typeof serverSdk.metrics; export { withSentryConfig } from './config'; diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 2e658f7abc36..4e1d1be22a8f 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -116,6 +116,7 @@ export { extraErrorDataIntegration, rewriteFramesIntegration, sessionTimingIntegration, + // eslint-disable-next-line deprecation/deprecation metricsDefault as metrics, startSession, captureSession, diff --git a/packages/nuxt/src/index.types.ts b/packages/nuxt/src/index.types.ts index eca64effb5b4..ceb6c7fc207c 100644 --- a/packages/nuxt/src/index.types.ts +++ b/packages/nuxt/src/index.types.ts @@ -15,4 +15,5 @@ export declare const contextLinesIntegration: typeof clientSdk.contextLinesInteg export declare const getDefaultIntegrations: (options: Options) => Integration[]; export declare const defaultStackParser: StackParser; export declare const continueTrace: typeof clientSdk.continueTrace; +// eslint-disable-next-line deprecation/deprecation export declare const metrics: typeof clientSdk.metrics & typeof serverSdk.metrics; diff --git a/packages/remix/src/index.server.ts b/packages/remix/src/index.server.ts index 098bd1293080..ffb5cf74983f 100644 --- a/packages/remix/src/index.server.ts +++ b/packages/remix/src/index.server.ts @@ -74,6 +74,7 @@ export { linkedErrorsIntegration, localVariablesIntegration, makeNodeTransport, + // eslint-disable-next-line deprecation/deprecation metrics, modulesIntegration, mongoIntegration, diff --git a/packages/remix/src/index.types.ts b/packages/remix/src/index.types.ts index b3342ff35250..b7b7bd9d9a73 100644 --- a/packages/remix/src/index.types.ts +++ b/packages/remix/src/index.types.ts @@ -39,4 +39,5 @@ export const close = runtime === 'client' ? clientSdk.close : serverSdk.close; export const flush = runtime === 'client' ? clientSdk.flush : serverSdk.flush; export const lastEventId = runtime === 'client' ? clientSdk.lastEventId : serverSdk.lastEventId; +// eslint-disable-next-line deprecation/deprecation export declare const metrics: typeof clientSdk.metrics & typeof serverSdk.metrics; diff --git a/packages/solidstart/src/index.types.ts b/packages/solidstart/src/index.types.ts index ef3cd196651b..13ff38425a1c 100644 --- a/packages/solidstart/src/index.types.ts +++ b/packages/solidstart/src/index.types.ts @@ -27,4 +27,5 @@ export declare function lastEventId(): string | undefined; export declare const continueTrace: typeof clientSdk.continueTrace; +// eslint-disable-next-line deprecation/deprecation export declare const metrics: typeof clientSdk.metrics & typeof serverSdk.metrics; diff --git a/packages/solidstart/src/server/index.ts b/packages/solidstart/src/server/index.ts index d537ddd51e88..ccec95b916d3 100644 --- a/packages/solidstart/src/server/index.ts +++ b/packages/solidstart/src/server/index.ts @@ -65,6 +65,7 @@ export { linkedErrorsIntegration, localVariablesIntegration, makeNodeTransport, + // eslint-disable-next-line deprecation/deprecation metrics, modulesIntegration, mongoIntegration, diff --git a/packages/sveltekit/src/index.types.ts b/packages/sveltekit/src/index.types.ts index 4cccbf2a1ab7..bdd8a23c3c70 100644 --- a/packages/sveltekit/src/index.types.ts +++ b/packages/sveltekit/src/index.types.ts @@ -52,6 +52,7 @@ export declare function lastEventId(): string | undefined; export declare const continueTrace: typeof clientSdk.continueTrace; +// eslint-disable-next-line deprecation/deprecation export declare const metrics: typeof clientSdk.metrics & typeof serverSdk.metrics; export declare function trackComponent(options: clientSdk.TrackingOptions): ReturnType; diff --git a/packages/sveltekit/src/server/index.ts b/packages/sveltekit/src/server/index.ts index 72b459e2fde3..728616945286 100644 --- a/packages/sveltekit/src/server/index.ts +++ b/packages/sveltekit/src/server/index.ts @@ -67,6 +67,7 @@ export { linkedErrorsIntegration, localVariablesIntegration, makeNodeTransport, + // eslint-disable-next-line deprecation/deprecation metrics, modulesIntegration, mongoIntegration, diff --git a/packages/vercel-edge/src/index.ts b/packages/vercel-edge/src/index.ts index 7eb7893e974a..e222d2de1ad1 100644 --- a/packages/vercel-edge/src/index.ts +++ b/packages/vercel-edge/src/index.ts @@ -65,6 +65,7 @@ export { withActiveSpan, getSpanDescendants, continueTrace, + // eslint-disable-next-line deprecation/deprecation metrics, functionToStringIntegration, inboundFiltersIntegration, From 053ccbb202592a4644d610209363198cd0706bc7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:39:07 +0000 Subject: [PATCH 21/31] feat(deps): bump @opentelemetry/instrumentation-graphql from 0.43.0 to 0.44.0 (#14173) --- packages/node/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/node/package.json b/packages/node/package.json index 073dca72ac02..5da2cc61314f 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -76,7 +76,7 @@ "@opentelemetry/instrumentation-fastify": "0.41.0", "@opentelemetry/instrumentation-fs": "0.16.0", "@opentelemetry/instrumentation-generic-pool": "0.39.0", - "@opentelemetry/instrumentation-graphql": "0.43.0", + "@opentelemetry/instrumentation-graphql": "0.44.0", "@opentelemetry/instrumentation-hapi": "0.41.0", "@opentelemetry/instrumentation-http": "0.53.0", "@opentelemetry/instrumentation-ioredis": "0.43.0", diff --git a/yarn.lock b/yarn.lock index 8a05bb0126bd..2583ec67b7b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7389,12 +7389,12 @@ dependencies: "@opentelemetry/instrumentation" "^0.53.0" -"@opentelemetry/instrumentation-graphql@0.43.0": - version "0.43.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz#71bb94ea775c70dbd388c739b397ec1418f3f170" - integrity sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA== +"@opentelemetry/instrumentation-graphql@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.44.0.tgz#6fce8e2f303d16810bf8a03148cad6e8e6119de1" + integrity sha512-FYXTe3Bv96aNpYktqm86BFUTpjglKD0kWI5T5bxYkLUPEPvFn38vWGMJTGrDMVou/i55E4jlWvcm6hFIqLsMbg== dependencies: - "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/instrumentation-hapi@0.41.0": version "0.41.0" From 04399876cb6cbfe71cf50dbb8790f7edba295eb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 19:04:10 +0000 Subject: [PATCH 22/31] feat(deps): bump @opentelemetry/instrumentation from 0.53.0 to 0.54.0 (#14174) --- packages/node/package.json | 2 +- packages/solidstart/package.json | 2 +- yarn.lock | 20 +++++--------------- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/packages/node/package.json b/packages/node/package.json index 5da2cc61314f..aad7c1d6ba6d 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -68,7 +68,7 @@ "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.25.1", "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/instrumentation-amqplib": "^0.42.0", "@opentelemetry/instrumentation-connect": "0.40.0", "@opentelemetry/instrumentation-dataloader": "0.12.0", diff --git a/packages/solidstart/package.json b/packages/solidstart/package.json index 49d515c2bd2e..6e1c20687352 100644 --- a/packages/solidstart/package.json +++ b/packages/solidstart/package.json @@ -66,7 +66,7 @@ } }, "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@sentry/core": "8.36.0", "@sentry/node": "8.36.0", "@sentry/opentelemetry": "8.36.0", diff --git a/yarn.lock b/yarn.lock index 2583ec67b7b2..ebae3de536a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10152,12 +10152,7 @@ "@types/mime" "*" "@types/node" "*" -"@types/shimmer@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.0.2.tgz#93eb2c243c351f3f17d5c580c7467ae5d686b65f" - integrity sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg== - -"@types/shimmer@^1.2.0": +"@types/shimmer@^1.0.2", "@types/shimmer@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded" integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg== @@ -29583,21 +29578,16 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" From 5b77c9b0921c02b2ed0eaa5432cdda1bf83aa535 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 19:29:09 +0000 Subject: [PATCH 23/31] feat(deps): bump @opentelemetry/propagator-aws-xray from 1.25.1 to 1.26.0 (#14172) --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index ebae3de536a2..1475483749eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7573,11 +7573,11 @@ integrity sha512-bgab3q/4dYUutUpQCEaSDa+mLoQJG3vJKeSiGuhM4iZaSpkz8ov0fs1MGil5PfxCo6Hhw3bB3bFYhUtnsfT/Pg== "@opentelemetry/propagator-aws-xray@^1.3.1": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.25.1.tgz#8bfc812308c0b94c2d80203863b53572cd9f1f72" - integrity sha512-soZQdO9EAROMwa9bL2C0VLadbrfRjSA9t7g6X8sL0X1B8V59pzOayYMyTW9qTECn9uuJV98A7qOnJm6KH6yk8w== + version "1.26.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.0.tgz#becd2b9208eb554cc606529f68e58dfd03a20f4d" + integrity sha512-Sex+JyEZ/xX328TArBqQjh1NZSfNyw5NdASUIi9hnPsnMBMSBaDe7B9JRnXv0swz7niNyAnXa6MY7yOCV76EvA== dependencies: - "@opentelemetry/core" "1.25.1" + "@opentelemetry/core" "1.26.0" "@opentelemetry/redis-common@^0.36.2": version "0.36.2" From 7f7d6091e306f3260db4945afa8adf8ef11f211b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 19:29:27 +0000 Subject: [PATCH 24/31] feat(deps): bump @opentelemetry/instrumentation-mongodb from 0.47.0 to 0.48.0 (#14171) --- packages/node/package.json | 2 +- yarn.lock | 40 +++++--------------------------------- 2 files changed, 6 insertions(+), 36 deletions(-) diff --git a/packages/node/package.json b/packages/node/package.json index aad7c1d6ba6d..d421cda8f755 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -83,7 +83,7 @@ "@opentelemetry/instrumentation-kafkajs": "0.4.0", "@opentelemetry/instrumentation-koa": "0.43.0", "@opentelemetry/instrumentation-lru-memoizer": "0.40.0", - "@opentelemetry/instrumentation-mongodb": "0.47.0", + "@opentelemetry/instrumentation-mongodb": "0.48.0", "@opentelemetry/instrumentation-mongoose": "0.42.0", "@opentelemetry/instrumentation-mysql": "0.41.0", "@opentelemetry/instrumentation-mysql2": "0.41.0", diff --git a/yarn.lock b/yarn.lock index 1475483749eb..652c5721f5b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7279,13 +7279,6 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/context-base/-/context-base-0.12.0.tgz#4906ae27359d3311e3dea1b63770a16f60848550" integrity sha512-UXwSsXo3F3yZ1dIBOG9ID8v2r9e+bqLWoizCtTb8rXtwF+N5TM7hzzvQz72o3nBU+zrI/D5e+OqAYK8ZgDd3DA== -"@opentelemetry/core@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.25.0.tgz#ad034f5c2669f589bd703bfbbaa38b51f8504053" - integrity sha512-n0B3s8rrqGrasTgNkXLKXzN0fXo+6IYP7M5b7AMsrZM33f/y6DS6kJ0Btd7SespASWq8bgL3taLo0oe0vB52IQ== - dependencies: - "@opentelemetry/semantic-conventions" "1.25.0" - "@opentelemetry/core@1.25.1": version "1.25.1" resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.25.1.tgz#ff667d939d128adfc7c793edae2f6bca177f829d" @@ -7448,13 +7441,12 @@ dependencies: "@opentelemetry/instrumentation" "^0.53.0" -"@opentelemetry/instrumentation-mongodb@0.47.0": - version "0.47.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz#f8107d878281433905e717f223fb4c0f10356a7b" - integrity sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ== +"@opentelemetry/instrumentation-mongodb@0.48.0": + version "0.48.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.48.0.tgz#40fb8c705cb4bf8d8c5bf8752c60c5a0aaaaf617" + integrity sha512-9YWvaGvrrcrydMsYGLu0w+RgmosLMKe3kv/UNlsPy8RLnCkN2z+bhhbjjjuxtUmvEuKZMCoXFluABVuBr1yhjw== dependencies: - "@opentelemetry/instrumentation" "^0.53.0" - "@opentelemetry/sdk-metrics" "^1.9.1" + "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@opentelemetry/instrumentation-mongoose@0.42.0": @@ -7584,14 +7576,6 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz#906ac8e4d804d4109f3ebd5c224ac988276fdc47" integrity sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g== -"@opentelemetry/resources@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.25.0.tgz#84a1e70097e342aa2047aac97be114ad14966793" - integrity sha512-iHjydPMYJ+Li1auveJCq2rp5U2h6Mhq8BidiyE0jfVlDTFyR1ny8AfJHfmFzJ/RAM8vT8L7T21kcmGybxZC7lQ== - dependencies: - "@opentelemetry/core" "1.25.0" - "@opentelemetry/semantic-conventions" "1.25.0" - "@opentelemetry/resources@1.25.1", "@opentelemetry/resources@^1.8.0": version "1.25.1" resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.25.1.tgz#bb9a674af25a1a6c30840b755bc69da2796fefbb" @@ -7616,15 +7600,6 @@ "@opentelemetry/api" "^0.12.0" "@opentelemetry/core" "^0.12.0" -"@opentelemetry/sdk-metrics@^1.9.1": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.0.tgz#0c954d580c17821ae4385d29447718df09e80b79" - integrity sha512-IF+Sv4VHgBr/BPMKabl+GouJIhEqAOexCHgXVTISdz3q9P9H/uA8ScCF+22gitQ69aFtESbdYOV+Fen5+avQng== - dependencies: - "@opentelemetry/core" "1.25.0" - "@opentelemetry/resources" "1.25.0" - lodash.merge "^4.6.2" - "@opentelemetry/sdk-trace-base@^1.22": version "1.25.1" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz#cbc1e60af255655d2020aa14cde17b37bd13df37" @@ -7643,11 +7618,6 @@ "@opentelemetry/resources" "1.26.0" "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/semantic-conventions@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.0.tgz#390eb4d42a29c66bdc30066af9035645e9bb7270" - integrity sha512-M+kkXKRAIAiAP6qYyesfrC5TOmDpDVtsxuGfPcqd9B/iBrac+E14jYwrgm0yZBUIbIP2OnqC3j+UgkXLm1vxUQ== - "@opentelemetry/semantic-conventions@1.25.1": version "1.25.1" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz#0deecb386197c5e9c2c28f2f89f51fb8ae9f145e" From 028db6fc320b39eb0cc7d0f90be94e3fb4bdacc4 Mon Sep 17 00:00:00 2001 From: Espen Hovlandsdal Date: Mon, 4 Nov 2024 11:31:22 -0800 Subject: [PATCH 25/31] ref: Fix typos in various places (#14144) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed one typo and then found another, and another… Most of these aren't exactly critical as they're mostly in comments/tests, but some are in TSDocs and package descriptions which might be nice to get fixed. Co-authored-by: Sigrid Huemer <32902192+s1gr1d@users.noreply.github.com> --- .../suites/feedback/attachTo/init.js | 2 +- .../suites/feedback/attachTo/template.html | 2 +- .../suites/feedback/attachTo/test.ts | 2 +- .../onError/non-string-arg/test.ts | 2 +- .../instrumentation/onError/rethrown/test.ts | 2 +- .../onError/syntax-errors/test.ts | 2 +- .../onError/thrown-errors/test.ts | 2 +- .../onError/thrown-objects/test.ts | 2 +- .../onError/thrown-strings/test.ts | 2 +- .../public-api/startSpan/error-sync/test.ts | 2 +- .../suites/replay/sessionInactive/init.js | 2 +- .../suites/replay/throttleBreadcrumbs/test.ts | 2 +- .../browserTracingIntegration/error/test.ts | 2 +- .../interactions/subject.js | 4 ++-- .../assets/script.js | 4 ++-- .../assets/script.js | 4 ++-- .../long-tasks-disabled/assets/script.js | 4 ++-- .../long-tasks-enabled/assets/script.js | 4 ++-- .../assets/script.js | 4 ++-- .../metrics/pageload-resource-spans/test.ts | 2 +- .../browser-integration-tests/utils/helpers.ts | 4 ++-- .../utils/replayEventTemplates.ts | 2 +- .../astro-4/src/pages/index.astro | 2 +- .../nextjs-14/tests/generation-functions.test.ts | 12 ++++++------ .../node-otel-custom-sampler/src/instrument.ts | 2 +- .../tests/errors.test.ts | 2 +- .../react-router-6/tests/sse.test.ts | 2 +- .../express/tracing/tracesSampler/server.js | 2 +- .../plugins/extractPolyfillsPlugin.mjs | 4 ++-- dev-packages/size-limit-gh-action/index.mjs | 2 +- docs/creating-a-new-sdk.md | 4 ++-- docs/migration/feedback.md | 4 ++-- docs/v8-node.md | 2 +- packages/astro/README.md | 2 +- .../astro/src/integration/middleware/index.ts | 2 +- packages/astro/src/integration/types.ts | 4 ++-- packages/browser-utils/src/instrument/dom.ts | 4 ++-- .../browser-utils/src/metrics/browserMetrics.ts | 2 +- packages/browser/src/integrations/breadcrumbs.ts | 2 +- .../src/integrations/reportingobserver.ts | 2 +- .../browser/src/profiling/startProfileForSpan.ts | 2 +- packages/browser/src/profiling/utils.ts | 2 +- packages/browser/src/tracing/request.ts | 2 +- packages/browser/src/transports/fetch.ts | 4 ++-- packages/browser/src/transports/offline.ts | 2 +- packages/browser/test/loader.js | 4 ++-- packages/bun/test/sdk.test.ts | 2 +- packages/cloudflare/package.json | 2 +- packages/cloudflare/src/async.ts | 2 +- packages/core/src/baseclient.ts | 4 ++-- packages/core/src/currentScopes.ts | 2 +- packages/core/src/envelope.ts | 2 +- packages/core/src/fetch.ts | 2 +- packages/core/src/semanticAttributes.ts | 2 +- packages/core/src/tracing/errors.ts | 2 +- packages/core/src/tracing/idleSpan.ts | 2 +- .../core/src/tracing/sentryNonRecordingSpan.ts | 6 +++--- packages/core/src/utils/parameterize.ts | 2 +- packages/core/test/lib/integration.test.ts | 2 +- packages/core/test/lib/tracing/idleSpan.test.ts | 6 +++--- .../test/lib/utils/handleCallbackErrors.test.ts | 2 +- packages/core/test/lib/utils/spanUtils.test.ts | 2 +- packages/eslint-config-sdk/src/base.js | 6 +++--- packages/feedback/README.md | 2 +- packages/feedback/src/modal/components/Form.tsx | 2 +- packages/nextjs/rollup.npm.config.mjs | 2 +- .../routing/appRouterRoutingInstrumentation.ts | 2 +- .../nextjs/src/config/loaders/prefixLoader.ts | 2 +- .../nextjs/src/config/loaders/wrappingLoader.ts | 10 +++++----- .../src/config/templates/apiWrapperTemplate.ts | 4 ++-- .../src/config/templates/pageWrapperTemplate.ts | 2 +- .../templates/serverComponentWrapperTemplate.ts | 2 +- packages/nextjs/src/config/webpack.ts | 2 +- packages/nextjs/src/index.types.ts | 2 +- packages/nextjs/test/serverSdk.test.ts | 2 +- packages/node/src/integrations/http/index.ts | 2 +- packages/node/src/integrations/tracing/prisma.ts | 2 +- packages/node/src/types.ts | 2 +- .../node/test/integration/transactions.test.ts | 2 +- packages/node/test/sdk/init.test.ts | 2 +- packages/opentelemetry/src/spanExporter.ts | 4 ++-- packages/opentelemetry/src/types.ts | 2 +- .../opentelemetry/src/utils/isSentryRequest.ts | 2 +- .../test/asyncContextStrategy.test.ts | 16 ++++++++-------- .../test/integration/transactions.test.ts | 2 +- packages/opentelemetry/test/propagator.test.ts | 2 +- .../test/utils/parseSpanDescription.test.ts | 2 +- packages/profiling-node/README.md | 2 +- packages/profiling-node/bindings/cpu_profiler.cc | 2 +- packages/profiling-node/scripts/check-build.js | 2 +- packages/profiling-node/scripts/copy-target.js | 2 +- .../scripts/prune-profiler-binaries.js | 4 ++-- packages/profiling-node/src/cpu_profiler.ts | 2 +- packages/profiling-node/src/utils.ts | 2 +- packages/profiling-node/test/bindings.test.ts | 2 +- .../profiling-node/test/cpu_profiler.test.ts | 2 +- .../profiling-node/test/spanProfileUtils.test.ts | 2 +- packages/react/README.md | 2 +- packages/react/src/profiler.tsx | 4 ++-- packages/react/src/reactrouter.tsx | 2 +- packages/react/src/reactrouterv6.tsx | 4 ++-- packages/react/src/types.ts | 2 +- packages/react/test/reactrouterv6.test.tsx | 4 ++-- packages/remix/src/index.types.ts | 2 +- packages/replay-internal/README.md | 2 +- .../src/coreHandlers/handleClick.ts | 6 +++--- .../src/coreHandlers/util/fetchUtils.ts | 2 +- .../util/shouldSampleForBufferEvent.ts | 2 +- .../src/coreHandlers/util/xhrUtils.ts | 2 +- .../eventBuffer/EventBufferCompressionWorker.ts | 4 ++-- .../src/eventBuffer/WorkerHandler.ts | 2 +- packages/replay-internal/src/replay.ts | 6 +++--- packages/replay-internal/src/types/rrweb.ts | 2 +- packages/replay-internal/src/util/addEvent.ts | 2 +- .../replay-internal/src/util/maskAttribute.ts | 2 +- .../test/integration/earlyEvents.test.ts | 2 +- .../test/unit/coreHandlers/handleClick.test.ts | 10 +++++----- .../coreHandlers/handleKeyboardEvent.test.ts | 2 +- .../unit/coreHandlers/util/networkUtils.test.ts | 2 +- .../test/unit/util/debounce.test.ts | 2 +- packages/replay-worker/README.md | 2 +- packages/solidstart/README.md | 2 +- packages/solidstart/rollup.npm.config.mjs | 2 +- packages/svelte/src/sdk.ts | 2 +- packages/svelte/src/types.ts | 2 +- packages/sveltekit/src/client/load.ts | 2 +- packages/sveltekit/src/index.types.ts | 2 +- packages/sveltekit/src/vite/autoInstrument.ts | 2 +- packages/sveltekit/src/vite/detectAdapter.ts | 2 +- packages/sveltekit/src/vite/sourceMaps.ts | 2 +- packages/sveltekit/src/vite/svelteConfig.ts | 2 +- packages/sveltekit/src/vite/types.ts | 2 +- .../client/browserTracingIntegration.test.ts | 2 +- packages/sveltekit/test/server/handle.test.ts | 4 ++-- packages/types/src/client.ts | 4 ++-- packages/types/src/feedback/config.ts | 2 +- packages/types/src/mechanism.ts | 2 +- packages/types/src/scope.ts | 2 +- packages/utils/src/browser.ts | 4 ++-- packages/utils/src/buildPolyfills/README.md | 2 +- packages/utils/src/envelope.ts | 2 +- packages/utils/src/normalize.ts | 2 +- packages/utils/src/object.ts | 2 +- packages/utils/test/string.test.ts | 4 ++-- packages/utils/test/syncpromise.test.ts | 4 ++-- packages/utils/test/url.test.ts | 4 ++-- packages/vercel-edge/package.json | 2 +- tsconfig-templates/README.md | 2 +- 148 files changed, 206 insertions(+), 206 deletions(-) diff --git a/dev-packages/browser-integration-tests/suites/feedback/attachTo/init.js b/dev-packages/browser-integration-tests/suites/feedback/attachTo/init.js index 5eb27143fdc7..740fb69558ed 100644 --- a/dev-packages/browser-integration-tests/suites/feedback/attachTo/init.js +++ b/dev-packages/browser-integration-tests/suites/feedback/attachTo/init.js @@ -14,4 +14,4 @@ Sentry.init({ integrations: [feedback], }); -feedback.attachTo('#custom-feedback-buttom'); +feedback.attachTo('#custom-feedback-button'); diff --git a/dev-packages/browser-integration-tests/suites/feedback/attachTo/template.html b/dev-packages/browser-integration-tests/suites/feedback/attachTo/template.html index ae36b0c69c7b..d0c83c526ca4 100644 --- a/dev-packages/browser-integration-tests/suites/feedback/attachTo/template.html +++ b/dev-packages/browser-integration-tests/suites/feedback/attachTo/template.html @@ -4,6 +4,6 @@ - + diff --git a/dev-packages/browser-integration-tests/suites/feedback/attachTo/test.ts b/dev-packages/browser-integration-tests/suites/feedback/attachTo/test.ts index 8c605597020d..022e8f789c2a 100644 --- a/dev-packages/browser-integration-tests/suites/feedback/attachTo/test.ts +++ b/dev-packages/browser-integration-tests/suites/feedback/attachTo/test.ts @@ -26,7 +26,7 @@ sentryTest('should capture feedback with custom button', async ({ getLocalTestUr const url = await getLocalTestUrl({ testDir: __dirname }); await page.goto(url); - await page.locator('#custom-feedback-buttom').click(); + await page.locator('#custom-feedback-button').click(); await page.waitForSelector(':visible:text-is("Report a Bug")'); expect(await page.locator(':visible:text-is("Report a Bug")').count()).toEqual(1); diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/non-string-arg/test.ts b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/non-string-arg/test.ts index 681d5db8bf02..86227532efb1 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/non-string-arg/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/non-string-arg/test.ts @@ -8,7 +8,7 @@ sentryTest( 'should catch onerror calls with non-string first argument gracefully', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/rethrown/test.ts b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/rethrown/test.ts index 01b319e759b2..58a35d86a800 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/rethrown/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/rethrown/test.ts @@ -8,7 +8,7 @@ sentryTest( 'should NOT catch an exception already caught [but rethrown] via Sentry.captureException', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/syntax-errors/test.ts b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/syntax-errors/test.ts index 2b6cc09be8a2..46b68f8ccb24 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/syntax-errors/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/syntax-errors/test.ts @@ -6,7 +6,7 @@ import { getFirstSentryEnvelopeRequest, runScriptInSandbox } from '../../../../. sentryTest('should catch syntax errors', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-errors/test.ts b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-errors/test.ts index 17dd6c650b43..47607a22b289 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-errors/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-errors/test.ts @@ -6,7 +6,7 @@ import { getFirstSentryEnvelopeRequest, runScriptInSandbox } from '../../../../. sentryTest('should catch thrown errors', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-objects/test.ts b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-objects/test.ts index 4ed03991ff58..71159b605b4e 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-objects/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-objects/test.ts @@ -6,7 +6,7 @@ import { getFirstSentryEnvelopeRequest, runScriptInSandbox } from '../../../../. sentryTest('should catch thrown objects', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-strings/test.ts b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-strings/test.ts index 326cf414f0f8..ff98e805f9aa 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-strings/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/onError/thrown-strings/test.ts @@ -6,7 +6,7 @@ import { getFirstSentryEnvelopeRequest, runScriptInSandbox } from '../../../../. sentryTest('should catch thrown strings', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/public-api/startSpan/error-sync/test.ts b/dev-packages/browser-integration-tests/suites/public-api/startSpan/error-sync/test.ts index bb7b3b43c516..4c4388dab435 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/startSpan/error-sync/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/startSpan/error-sync/test.ts @@ -12,7 +12,7 @@ sentryTest( 'should capture an error within a sync startSpan callback', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/replay/sessionInactive/init.js b/dev-packages/browser-integration-tests/suites/replay/sessionInactive/init.js index 874580a83eff..3af8409da672 100644 --- a/dev-packages/browser-integration-tests/suites/replay/sessionInactive/init.js +++ b/dev-packages/browser-integration-tests/suites/replay/sessionInactive/init.js @@ -18,5 +18,5 @@ Sentry.init({ window.Replay._replay.timeouts = { sessionIdlePause: 1000, // this is usually 5min, but we want to test this with shorter times - sessionIdleExpire: 900000, // defayult: 15min + sessionIdleExpire: 900000, // default: 15min }; diff --git a/dev-packages/browser-integration-tests/suites/replay/throttleBreadcrumbs/test.ts b/dev-packages/browser-integration-tests/suites/replay/throttleBreadcrumbs/test.ts index 62bfda2b0a8c..b01a980ea961 100644 --- a/dev-packages/browser-integration-tests/suites/replay/throttleBreadcrumbs/test.ts +++ b/dev-packages/browser-integration-tests/suites/replay/throttleBreadcrumbs/test.ts @@ -30,7 +30,7 @@ sentryTest( const spans = [...res0.performanceSpans, ...res1.performanceSpans]; expect(breadcrumbs.filter(breadcrumb => breadcrumb.category === 'replay.throttled').length).toBe(1); // replay.throttled breadcrumb does *not* use the throttledAddEvent as we - // alwants want that breadcrumb to be present in replay + // always want that breadcrumb to be present in replay expect(breadcrumbs.length + spans.length).toBe(THROTTLE_LIMIT + 1); }, ); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/error/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/error/test.ts index 581f0fd206dc..7eaab8b2872e 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/error/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/error/test.ts @@ -11,7 +11,7 @@ sentryTest( 'should put the pageload transaction name onto an error event caught during pageload', async ({ getLocalTestPath, page, browserName }) => { if (browserName === 'webkit') { - // This test fails on Webkit as erros thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry + // This test fails on Webkit as errors thrown from `runScriptInSandbox` are Script Errors and skipped by Sentry sentryTest.skip(); } diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions/subject.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions/subject.js index f9503ef6f261..0d4772ba535d 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions/subject.js @@ -1,12 +1,12 @@ const blockUI = e => { const startTime = Date.now(); - function getElasped() { + function getElapsed() { const time = Date.now(); return time - startTime; } - while (getElasped() < 70) { + while (getElapsed() < 70) { // } diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/assets/script.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/assets/script.js index 9ac3d6fb33d2..195a094070be 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/assets/script.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/assets/script.js @@ -1,12 +1,12 @@ (() => { const startTime = Date.now(); - function getElasped() { + function getElapsed() { const time = Date.now(); return time - startTime; } - while (getElasped() < 101) { + while (getElapsed() < 101) { // } })(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/assets/script.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/assets/script.js index 9ac3d6fb33d2..195a094070be 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/assets/script.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/assets/script.js @@ -1,12 +1,12 @@ (() => { const startTime = Date.now(); - function getElasped() { + function getElapsed() { const time = Date.now(); return time - startTime; } - while (getElasped() < 101) { + while (getElapsed() < 101) { // } })(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/assets/script.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/assets/script.js index 9ac3d6fb33d2..195a094070be 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/assets/script.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/assets/script.js @@ -1,12 +1,12 @@ (() => { const startTime = Date.now(); - function getElasped() { + function getElapsed() { const time = Date.now(); return time - startTime; } - while (getElasped() < 101) { + while (getElapsed() < 101) { // } })(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/assets/script.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/assets/script.js index 5a2aef02028d..b61592e05943 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/assets/script.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/assets/script.js @@ -1,12 +1,12 @@ (() => { const startTime = Date.now(); - function getElasped() { + function getElapsed() { const time = Date.now(); return time - startTime; } - while (getElasped() < 105) { + while (getElapsed() < 105) { // } })(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/assets/script.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/assets/script.js index 5a2aef02028d..b61592e05943 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/assets/script.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/assets/script.js @@ -1,12 +1,12 @@ (() => { const startTime = Date.now(); - function getElasped() { + function getElapsed() { const time = Date.now(); return time - startTime; } - while (getElasped() < 105) { + while (getElapsed() < 105) { // } })(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts index e98cb5b3d9b2..fc74fa685bc7 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts @@ -20,7 +20,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca const eventData = await getFirstSentryEnvelopeRequest(page, url); const resourceSpans = eventData.spans?.filter(({ op }) => op?.startsWith('resource')); - // Webkit 16.0 (which is linked to Playwright 1.27.1) consistently creates 2 consectutive spans for `css`, + // Webkit 16.0 (which is linked to Playwright 1.27.1) consistently creates 2 consecutive spans for `css`, // so we need to check for 3 or 4 spans. if (browser.browserType().name() === 'webkit') { expect(resourceSpans?.length).toBeGreaterThanOrEqual(3); diff --git a/dev-packages/browser-integration-tests/utils/helpers.ts b/dev-packages/browser-integration-tests/utils/helpers.ts index 3163ef8d6a60..4e836bc57528 100644 --- a/dev-packages/browser-integration-tests/utils/helpers.ts +++ b/dev-packages/browser-integration-tests/utils/helpers.ts @@ -275,8 +275,8 @@ export function shouldSkipMetricsTest(): boolean { /** * Waits until a number of requests matching urlRgx at the given URL arrive. - * If the timout option is configured, this function will abort waiting, even if it hasn't reveived the configured - * amount of requests, and returns all the events recieved up to that point in time. + * If the timeout option is configured, this function will abort waiting, even if it hasn't received the configured + * amount of requests, and returns all the events received up to that point in time. */ async function getMultipleRequests( page: Page, diff --git a/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts b/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts index e711ea3bb0bb..51760544d868 100644 --- a/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts +++ b/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts @@ -44,7 +44,7 @@ const DEFAULT_REPLAY_EVENT = { * This is useful for testing multi-segment replays to not repeat most of the properties that don't change * throughout the replay segments. * - * Note: The benfit of this approach over expect.objectContaining is that, + * Note: The benefit of this approach over expect.objectContaining is that, * we'll catch if properties we expect to stay the same actually change. * * @param customExpectedReplayEvent overwrite the default values with custom values (e.g. segment_id) diff --git a/dev-packages/e2e-tests/test-applications/astro-4/src/pages/index.astro b/dev-packages/e2e-tests/test-applications/astro-4/src/pages/index.astro index 088205fc4028..deaf37caad12 100644 --- a/dev-packages/e2e-tests/test-applications/astro-4/src/pages/index.astro +++ b/dev-packages/e2e-tests/test-applications/astro-4/src/pages/index.astro @@ -8,7 +8,7 @@ import Layout from '../layouts/Layout.astro'; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts index bf3eca58a307..28b9d8cab43f 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts @@ -1,7 +1,7 @@ import { expect, test } from '@playwright/test'; import { waitForError, waitForTransaction } from '@sentry-internal/test-utils'; -test('Should emit a span for a generateMetadata() function invokation', async ({ page }) => { +test('Should emit a span for a generateMetadata() function invocation', async ({ page }) => { const testTitle = 'should-emit-span'; const transactionPromise = waitForTransaction('nextjs-14', async transactionEvent => { @@ -29,7 +29,7 @@ test('Should emit a span for a generateMetadata() function invokation', async ({ expect(pageTitle).toBe(testTitle); }); -test('Should send a transaction and an error event for a faulty generateMetadata() function invokation', async ({ +test('Should send a transaction and an error event for a faulty generateMetadata() function invocation', async ({ page, }) => { const testTitle = 'should-emit-error'; @@ -59,7 +59,7 @@ test('Should send a transaction and an error event for a faulty generateMetadata expect(transactionEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined(); }); -test('Should send a transaction event for a generateViewport() function invokation', async ({ page }) => { +test('Should send a transaction event for a generateViewport() function invocation', async ({ page }) => { const testTitle = 'floob'; const transactionPromise = waitForTransaction('nextjs-14', async transactionEvent => { @@ -83,7 +83,7 @@ test('Should send a transaction event for a generateViewport() function invokati ); }); -test('Should send a transaction and an error event for a faulty generateViewport() function invokation', async ({ +test('Should send a transaction and an error event for a faulty generateViewport() function invocation', async ({ page, }) => { const testTitle = 'blargh'; @@ -109,7 +109,7 @@ test('Should send a transaction and an error event for a faulty generateViewport expect(errorEvent.transaction).toBe('Page.generateViewport (/generation-functions)'); }); -test('Should send a transaction event with correct status for a generateMetadata() function invokation with redirect()', async ({ +test('Should send a transaction event with correct status for a generateMetadata() function invocation with redirect()', async ({ page, }) => { const testTitle = 'redirect-foobar'; @@ -126,7 +126,7 @@ test('Should send a transaction event with correct status for a generateMetadata expect((await transactionPromise).contexts?.trace?.status).toBe('ok'); }); -test('Should send a transaction event with correct status for a generateMetadata() function invokation with notfound()', async ({ +test('Should send a transaction event with correct status for a generateMetadata() function invocation with notfound()', async ({ page, }) => { const testTitle = 'notfound-foobar'; diff --git a/dev-packages/e2e-tests/test-applications/node-otel-custom-sampler/src/instrument.ts b/dev-packages/e2e-tests/test-applications/node-otel-custom-sampler/src/instrument.ts index bba794d9f027..b7279c9942a7 100644 --- a/dev-packages/e2e-tests/test-applications/node-otel-custom-sampler/src/instrument.ts +++ b/dev-packages/e2e-tests/test-applications/node-otel-custom-sampler/src/instrument.ts @@ -12,7 +12,7 @@ Sentry.init({ debug: !!process.env.DEBUG, tunnel: `http://localhost:3031/`, // proxy server skipOpenTelemetrySetup: true, - // By defining _any_ sample rate, tracing intergations will be added by default + // By defining _any_ sample rate, tracing integrations will be added by default tracesSampleRate: 0, }); diff --git a/dev-packages/e2e-tests/test-applications/node-otel-without-tracing/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/node-otel-without-tracing/tests/errors.test.ts index 1e4526a891a3..36231f87a464 100644 --- a/dev-packages/e2e-tests/test-applications/node-otel-without-tracing/tests/errors.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-otel-without-tracing/tests/errors.test.ts @@ -20,7 +20,7 @@ test('Sends correct error event', async ({ baseURL }) => { url: 'http://localhost:3030/test-exception/123', }); - // This is unparametrized here because we do not have the express instrumentation + // This is unparameterized here because we do not have the express instrumentation expect(errorEvent.transaction).toEqual('GET /test-exception/123'); expect(errorEvent.contexts?.trace).toEqual({ diff --git a/dev-packages/e2e-tests/test-applications/react-router-6/tests/sse.test.ts b/dev-packages/e2e-tests/test-applications/react-router-6/tests/sse.test.ts index 942e67ca4551..24ae70449ced 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-6/tests/sse.test.ts +++ b/dev-packages/e2e-tests/test-applications/react-router-6/tests/sse.test.ts @@ -65,7 +65,7 @@ test('Waits for sse streaming when sse has been explicitly aborted', async ({ pa expect(resolveDuration).toBe(0); expect(resolveBodyDuration).toBe(0); - // validate abort eror was thrown by inspecting console + // validate abort error was thrown by inspecting console const consoleBreadcrumb = rootSpan.breadcrumbs?.find(breadcrumb => breadcrumb.category === 'console'); expect(consoleBreadcrumb?.message).toBe('Could not fetch sse AbortError: BodyStreamBuffer was aborted'); }); diff --git a/dev-packages/node-integration-tests/suites/express/tracing/tracesSampler/server.js b/dev-packages/node-integration-tests/suites/express/tracing/tracesSampler/server.js index bfe39fc89ee5..c096871cb755 100644 --- a/dev-packages/node-integration-tests/suites/express/tracing/tracesSampler/server.js +++ b/dev-packages/node-integration-tests/suites/express/tracing/tracesSampler/server.js @@ -8,7 +8,7 @@ Sentry.init({ tracesSampler: samplingContext => { // The name we get here is inferred at span creation time // At this point, we sadly do not have a http.route attribute yet, - // so we infer the name from the unparametrized route instead + // so we infer the name from the unparameterized route instead return ( samplingContext.name === 'GET /test/123' && samplingContext.attributes['sentry.op'] === 'http.server' && diff --git a/dev-packages/rollup-utils/plugins/extractPolyfillsPlugin.mjs b/dev-packages/rollup-utils/plugins/extractPolyfillsPlugin.mjs index ca5ff99438fd..e519f33b988f 100644 --- a/dev-packages/rollup-utils/plugins/extractPolyfillsPlugin.mjs +++ b/dev-packages/rollup-utils/plugins/extractPolyfillsPlugin.mjs @@ -13,7 +13,7 @@ const POLYFILL_NAMES = new Set([ ]); /** - * Create a plugin which will replace function definitions of any of the above funcions with an `import` or `require` + * Create a plugin which will replace function definitions of any of the above functions with an `import` or `require` * statement pulling them in from a central source. Mimics tsc's `importHelpers` option. */ export function makeExtractPolyfillsPlugin() { @@ -40,7 +40,7 @@ export function makeExtractPolyfillsPlugin() { return null; } - // The index.js file of the tuils package will include identifiers named after polyfills so we would inject the + // The index.js file of the utils package will include identifiers named after polyfills so we would inject the // polyfills, however that would override the exports so we should just skip that file. const isUtilsPackage = process.cwd().endsWith(`packages${path.sep}utils`); if (isUtilsPackage && sourceFile === 'index.js') { diff --git a/dev-packages/size-limit-gh-action/index.mjs b/dev-packages/size-limit-gh-action/index.mjs index 848802256853..1b8daa867e82 100644 --- a/dev-packages/size-limit-gh-action/index.mjs +++ b/dev-packages/size-limit-gh-action/index.mjs @@ -130,7 +130,7 @@ async function run() { const sizeLimitComment = await fetchPreviousComment(octokit, repo, pr); if (sizeLimitComment) { - core.debug('Found existing size limit comment, udpating it instead of creating a new one...'); + core.debug('Found existing size limit comment, updating it instead of creating a new one...'); } const shouldComment = diff --git a/docs/creating-a-new-sdk.md b/docs/creating-a-new-sdk.md index f33a33170dc4..549f224d5cc4 100644 --- a/docs/creating-a-new-sdk.md +++ b/docs/creating-a-new-sdk.md @@ -51,7 +51,7 @@ Some of the following concepts may be relevant to your SDK: - **Redirects**: If possible, we want to skip redirects. This means that if a user navigates to `/`, and this redirects the user internally to `/dashboard`, we only want to capture a single `/` navigation/pageload. - **Route Params**: Routes should be parametrized, which means that instead of `/users/123` we want to capture - `/users/:id` or simmilar. + `/users/:id` or similar. - **Query Params**: Query params should generally be removed from the route. #### Component Tracking @@ -88,7 +88,7 @@ own instrumentation to capture `http.server` spans. Some of the following concepts may be relevant to your SDK: - **Route Params**: Routes should be parametrized, which means that instead of `/users/123` we want to capture - `/users/:id` or simmilar. + `/users/:id` or similar. - **Query Params**: Query params should generally be removed from the route. #### Middleware Tracking diff --git a/docs/migration/feedback.md b/docs/migration/feedback.md index c6f328c9ff0f..3d612b9f94cc 100644 --- a/docs/migration/feedback.md +++ b/docs/migration/feedback.md @@ -1,6 +1,6 @@ # End of Feedback Beta -With the release of 8.0.0, Sentry Feedback is now out of Beta. This means that the usual stabilty guarantees apply. +With the release of 8.0.0, Sentry Feedback is now out of Beta. This means that the usual stability guarantees apply. Feedback 8.0.0 requires server version 24.4.2 and above. @@ -89,7 +89,7 @@ function attachTo(button: HTMLElement) { onFormClose: () => { widget.close(); }, - onFormSubmited: () => { + onFormSubmitted: () => { widget.removeFromDom(); } }); diff --git a/docs/v8-node.md b/docs/v8-node.md index 73339494bbf8..29891e2d129e 100644 --- a/docs/v8-node.md +++ b/docs/v8-node.md @@ -136,7 +136,7 @@ const { SentrySpanProcessor, SentryPropagator, SentryContextManager, SentrySampl // We need a custom span processor provider.addSpanProcessor(new SentrySpanProcessor()); // We need a custom propagator and context manager -provier.register({ +provider.register({ propagator: new SentryPropagator(), contextManager: new SentryContextManager(), }); diff --git a/packages/astro/README.md b/packages/astro/README.md index bbcf09f03720..7ffa655a7f63 100644 --- a/packages/astro/README.md +++ b/packages/astro/README.md @@ -77,7 +77,7 @@ export const onRequest = sequence( The Sentry middleware enhances the data collected by Sentry on the server side by: -- Enabeling distributed tracing between client and server +- Enabling distributed tracing between client and server - Collecting performance spans for incoming requests - Enhancing captured errors with additional information diff --git a/packages/astro/src/integration/middleware/index.ts b/packages/astro/src/integration/middleware/index.ts index e220f8843070..695eed6c2237 100644 --- a/packages/astro/src/integration/middleware/index.ts +++ b/packages/astro/src/integration/middleware/index.ts @@ -7,7 +7,7 @@ import { handleRequest } from '../../server/middleware'; * to astro ^3.5.0 projects. * * It's not possible to pass options at this moment, so we'll call our middleware - * factory function with the default options. Users can deactiveate the automatic + * factory function with the default options. Users can deactivate the automatic * middleware registration in our integration and manually add it in their own * `/src/middleware.js` file. */ diff --git a/packages/astro/src/integration/types.ts b/packages/astro/src/integration/types.ts index 8020bcde7c76..ede2f49ff732 100644 --- a/packages/astro/src/integration/types.ts +++ b/packages/astro/src/integration/types.ts @@ -7,7 +7,7 @@ type SdkInitPaths = { * * If this option is not specified, the default location (`/sentry.client.config.(js|ts)`) * will be used to look up the config file. - * If there is no file at the default location either, the SDK will initalize with the options + * If there is no file at the default location either, the SDK will initialize with the options * specified in the `sentryAstro` integration or with default options. */ clientInitPath?: string; @@ -17,7 +17,7 @@ type SdkInitPaths = { * * If this option is not specified, the default location (`/sentry.server.config.(js|ts)`) * will be used to look up the config file. - * If there is no file at the default location either, the SDK will initalize with the options + * If there is no file at the default location either, the SDK will initialize with the options * specified in the `sentryAstro` integration or with default options. */ serverInitPath?: string; diff --git a/packages/browser-utils/src/instrument/dom.ts b/packages/browser-utils/src/instrument/dom.ts index d08350a48766..7172ca575225 100644 --- a/packages/browser-utils/src/instrument/dom.ts +++ b/packages/browser-utils/src/instrument/dom.ts @@ -93,7 +93,7 @@ export function instrumentDOM(): void { handlerForType.refCount++; } catch (e) { // Accessing dom properties is always fragile. - // Also allows us to skip `addEventListenrs` calls with no proper `this` context. + // Also allows us to skip `addEventListeners` calls with no proper `this` context. } } @@ -133,7 +133,7 @@ export function instrumentDOM(): void { } } catch (e) { // Accessing dom properties is always fragile. - // Also allows us to skip `addEventListenrs` calls with no proper `this` context. + // Also allows us to skip `addEventListeners` calls with no proper `this` context. } } diff --git a/packages/browser-utils/src/metrics/browserMetrics.ts b/packages/browser-utils/src/metrics/browserMetrics.ts index 5789bbe94513..59a58290c502 100644 --- a/packages/browser-utils/src/metrics/browserMetrics.ts +++ b/packages/browser-utils/src/metrics/browserMetrics.ts @@ -418,7 +418,7 @@ export function _addMeasureSpans( // spans created by the Next.js framework. // // To prevent this we will pin the start timestamp to the request start time - // This does make duration inaccruate, so if this does happen, we will add + // This does make duration inaccurate, so if this does happen, we will add // an attribute to the span const measureStartTimestamp = timeOrigin + Math.max(startTime, requestTime); const startTimeStamp = timeOrigin + startTime; diff --git a/packages/browser/src/integrations/breadcrumbs.ts b/packages/browser/src/integrations/breadcrumbs.ts index db30a48dda67..360668c4ba64 100644 --- a/packages/browser/src/integrations/breadcrumbs.ts +++ b/packages/browser/src/integrations/breadcrumbs.ts @@ -117,7 +117,7 @@ function _getSentryBreadcrumbHandler(client: Client): (event: SentryEvent) => vo } /** - * A HOC that creaes a function that creates breadcrumbs from DOM API calls. + * A HOC that creates a function that creates breadcrumbs from DOM API calls. * This is a HOC so that we get access to dom options in the closure. */ function _getDomBreadcrumbHandler( diff --git a/packages/browser/src/integrations/reportingobserver.ts b/packages/browser/src/integrations/reportingobserver.ts index 12a4039542b9..8212386493fb 100644 --- a/packages/browser/src/integrations/reportingobserver.ts +++ b/packages/browser/src/integrations/reportingobserver.ts @@ -65,7 +65,7 @@ const _reportingObserverIntegration = ((options: ReportingObserverOptions = {}) let details = 'No details available'; if (report.body) { - // Object.keys doesn't work on ReportBody, as all properties are inheirted + // Object.keys doesn't work on ReportBody, as all properties are inherited const plainBody: { [key: string]: unknown; } = {}; diff --git a/packages/browser/src/profiling/startProfileForSpan.ts b/packages/browser/src/profiling/startProfileForSpan.ts index 9dcdb81a9e8e..8d7d91fdddc9 100644 --- a/packages/browser/src/profiling/startProfileForSpan.ts +++ b/packages/browser/src/profiling/startProfileForSpan.ts @@ -41,7 +41,7 @@ export function startProfileForSpan(span: Span): void { // Whichever of the two (span.finish/timeout) is first to run, the profiling will be stopped and the gathered profile // will be processed when the original span is finished. Since onProfileHandler can be invoked multiple times in the // event of an error or user mistake (calling span.finish multiple times), it is important that the behavior of onProfileHandler - // is idempotent as we do not want any timings or profiles to be overriden by the last call to onProfileHandler. + // is idempotent as we do not want any timings or profiles to be overridden by the last call to onProfileHandler. // After the original finish method is called, the event will be reported through the integration and delegated to transport. const processedProfile: JSSelfProfile | null = null; diff --git a/packages/browser/src/profiling/utils.ts b/packages/browser/src/profiling/utils.ts index 48e87450b0e8..50272d9b5554 100644 --- a/packages/browser/src/profiling/utils.ts +++ b/packages/browser/src/profiling/utils.ts @@ -601,7 +601,7 @@ export function createProfilingEvent( // TODO (v8): We need to obtain profile ids in @sentry-internal/tracing, // but we don't have access to this map because importing this map would -// cause a circular dependancy. We need to resolve this in v8. +// cause a circular dependency. We need to resolve this in v8. const PROFILE_MAP: Map = new Map(); /** * diff --git a/packages/browser/src/tracing/request.ts b/packages/browser/src/tracing/request.ts index 4efe76a637a5..b41a0bf24cc6 100644 --- a/packages/browser/src/tracing/request.ts +++ b/packages/browser/src/tracing/request.ts @@ -138,7 +138,7 @@ export function instrumentOutgoingRequests(client: Client, _options?: Partial = {}; if (traceFetch) { - // Keeping track of http requests, whose body payloads resolved later than the intial resolved request + // Keeping track of http requests, whose body payloads resolved later than the initial resolved request // e.g. streaming using server sent events (SSE) client.addEventProcessor(event => { if (event.type === 'transaction' && event.spans) { diff --git a/packages/browser/src/transports/fetch.ts b/packages/browser/src/transports/fetch.ts index f9a7c258d4ff..d1ded0f7da84 100644 --- a/packages/browser/src/transports/fetch.ts +++ b/packages/browser/src/transports/fetch.ts @@ -29,7 +29,7 @@ export function makeFetchTransport( // Outgoing requests are usually cancelled when navigating to a different page, causing a "TypeError: Failed to // fetch" error and sending a "network_error" client-outcome - in Chrome, the request status shows "(cancelled)". // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're - // frequently sending events right before the user is switching pages (eg. whenfinishing navigation transactions). + // frequently sending events right before the user is switching pages (eg. when finishing navigation transactions). // Gotchas: // - `keepalive` isn't supported by Firefox // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch): @@ -47,7 +47,7 @@ export function makeFetchTransport( } try { - // TODO: This may need a `suppresTracing` call in the future when we switch the browser SDK to OTEL + // TODO: This may need a `suppressTracing` call in the future when we switch the browser SDK to OTEL return nativeFetch(options.url, requestOptions).then(response => { pendingBodySize -= requestSize; pendingCount--; diff --git a/packages/browser/src/transports/offline.ts b/packages/browser/src/transports/offline.ts index a6755d8f43b5..7f5d22e466a9 100644 --- a/packages/browser/src/transports/offline.ts +++ b/packages/browser/src/transports/offline.ts @@ -8,7 +8,7 @@ import { makeFetchTransport } from './fetch'; // modified and simplified: https://github.com/jakearchibald/idb-keyval // // At commit: 0420a704fd6cbb4225429c536b1f61112d012fca -// Original licence: +// Original license: // Copyright 2016, Jake Archibald // diff --git a/packages/browser/test/loader.js b/packages/browser/test/loader.js index c80d5a1a4129..cfb749ae50a8 100644 --- a/packages/browser/test/loader.js +++ b/packages/browser/test/loader.js @@ -42,7 +42,7 @@ lazy ) { // We only want to lazy inject/load the sdk bundle if - // an error or promise rejection occured + // an error or promise rejection occurred // OR someone called `capture...` on the SDK injectSdk(onLoadCallbacks); } @@ -127,7 +127,7 @@ calledSentry = true; var call = data[i]; if (initAlreadyCalled === false && call.f !== 'init') { - // First call always has to be init, this is a conveniece for the user so call to init is optional + // First call always has to be init, this is a convenience for the user so call to init is optional SDK.init(); } initAlreadyCalled = true; diff --git a/packages/bun/test/sdk.test.ts b/packages/bun/test/sdk.test.ts index acef85f55eb5..a548cc2614c7 100644 --- a/packages/bun/test/sdk.test.ts +++ b/packages/bun/test/sdk.test.ts @@ -9,6 +9,6 @@ test("calling init shouldn't fail", () => { expect(true).toBe(true); }); -test('shuold return client from init', () => { +test('should return client from init', () => { expect(init({})).not.toBeUndefined(); }); diff --git a/packages/cloudflare/package.json b/packages/cloudflare/package.json index d5c4adbfb195..77b9bd14d5be 100644 --- a/packages/cloudflare/package.json +++ b/packages/cloudflare/package.json @@ -1,7 +1,7 @@ { "name": "@sentry/cloudflare", "version": "8.36.0", - "description": "Offical Sentry SDK for Cloudflare Workers and Pages", + "description": "Official Sentry SDK for Cloudflare Workers and Pages", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/cloudflare", "author": "Sentry", diff --git a/packages/cloudflare/src/async.ts b/packages/cloudflare/src/async.ts index 9662fc340a7e..c287a04474eb 100644 --- a/packages/cloudflare/src/async.ts +++ b/packages/cloudflare/src/async.ts @@ -8,7 +8,7 @@ import { AsyncLocalStorage } from 'node:async_hooks'; /** * Sets the async context strategy to use AsyncLocalStorage. * - * AsyncLocalStorage is only avalaible in the cloudflare workers runtime if you set + * AsyncLocalStorage is only available in the cloudflare workers runtime if you set * compatibility_flags = ["nodejs_compat"] or compatibility_flags = ["nodejs_als"] */ export function setAsyncLocalStorageAsyncContextStrategy(): void { diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts index 6071f644c37c..db79df0d1c16 100644 --- a/packages/core/src/baseclient.ts +++ b/packages/core/src/baseclient.ts @@ -472,7 +472,7 @@ export abstract class BaseClient implements Client { public on(hook: string, callback: unknown): () => void { const hooks = (this._hooks[hook] = this._hooks[hook] || []); - // @ts-expect-error We assue the types are correct + // @ts-expect-error We assume the types are correct hooks.push(callback); // This function returns a callback execution handler that, when invoked, @@ -480,7 +480,7 @@ export abstract class BaseClient implements Client { // need to be unregistered to prevent self-referencing in callback closures, // ensuring proper garbage collection. return () => { - // @ts-expect-error We assue the types are correct + // @ts-expect-error We assume the types are correct const cbIndex = hooks.indexOf(callback); if (cbIndex > -1) { hooks.splice(cbIndex, 1); diff --git a/packages/core/src/currentScopes.ts b/packages/core/src/currentScopes.ts index 9472d48b71bf..317042c08054 100644 --- a/packages/core/src/currentScopes.ts +++ b/packages/core/src/currentScopes.ts @@ -16,7 +16,7 @@ export function getCurrentScope(): Scope { /** * Get the currently active isolation scope. - * The isolation scope is active for the current exection context. + * The isolation scope is active for the current execution context. */ export function getIsolationScope(): Scope { const carrier = getMainCarrier(); diff --git a/packages/core/src/envelope.ts b/packages/core/src/envelope.ts index d8b8c03e888b..efe55ab685ac 100644 --- a/packages/core/src/envelope.ts +++ b/packages/core/src/envelope.ts @@ -76,7 +76,7 @@ export function createEventEnvelope( /* Note: Due to TS, event.type may be `replay_event`, theoretically. In practice, we never call `createEventEnvelope` with `replay_event` type, - and we'd have to adjut a looot of types to make this work properly. + and we'd have to adjust a looot of types to make this work properly. We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type) So the safe choice is to really guard against the replay_event type here. */ diff --git a/packages/core/src/fetch.ts b/packages/core/src/fetch.ts index 26a993ff0e12..29ff5d074cd0 100644 --- a/packages/core/src/fetch.ts +++ b/packages/core/src/fetch.ts @@ -23,7 +23,7 @@ import { getActiveSpan, spanToTraceHeader } from './utils/spanUtils'; type PolymorphicRequestHeaders = | Record | Array<[string, string]> - // the below is not preicsely the Header type used in Request, but it'll pass duck-typing + // the below is not precisely the Header type used in Request, but it'll pass duck-typing | { // eslint-disable-next-line @typescript-eslint/no-explicit-any [key: string]: any; diff --git a/packages/core/src/semanticAttributes.ts b/packages/core/src/semanticAttributes.ts index 2d24c52a15ea..2896bd81f93f 100644 --- a/packages/core/src/semanticAttributes.ts +++ b/packages/core/src/semanticAttributes.ts @@ -30,7 +30,7 @@ export const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT = 'sentry.measurement_un export const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE = 'sentry.measurement_value'; /** - * The id of the profile that this span occured in. + * The id of the profile that this span occurred in. */ export const SEMANTIC_ATTRIBUTE_PROFILE_ID = 'sentry.profile_id'; diff --git a/packages/core/src/tracing/errors.ts b/packages/core/src/tracing/errors.ts index 835038175331..a611dd1d80e4 100644 --- a/packages/core/src/tracing/errors.ts +++ b/packages/core/src/tracing/errors.ts @@ -36,7 +36,7 @@ function errorCallback(): void { const rootSpan = activeSpan && getRootSpan(activeSpan); if (rootSpan) { const message = 'internal_error'; - DEBUG_BUILD && logger.log(`[Tracing] Root span: ${message} -> Global error occured`); + DEBUG_BUILD && logger.log(`[Tracing] Root span: ${message} -> Global error occurred`); rootSpan.setStatus({ code: SPAN_STATUS_ERROR, message }); } } diff --git a/packages/core/src/tracing/idleSpan.ts b/packages/core/src/tracing/idleSpan.ts index c3d66a4b7593..3a9b705dd449 100644 --- a/packages/core/src/tracing/idleSpan.ts +++ b/packages/core/src/tracing/idleSpan.ts @@ -32,7 +32,7 @@ const FINISH_REASON_CANCELLED = 'cancelled'; // unused const FINISH_REASON_DOCUMENT_HIDDEN = 'documentHidden'; -// unusued in this file, but used in BrowserTracing +// unused in this file, but used in BrowserTracing const FINISH_REASON_INTERRUPTED = 'interactionInterrupted'; type IdleSpanFinishReason = diff --git a/packages/core/src/tracing/sentryNonRecordingSpan.ts b/packages/core/src/tracing/sentryNonRecordingSpan.ts index 867b5684d1da..c39730faf9c5 100644 --- a/packages/core/src/tracing/sentryNonRecordingSpan.ts +++ b/packages/core/src/tracing/sentryNonRecordingSpan.ts @@ -71,7 +71,7 @@ export class SentryNonRecordingSpan implements Span { /** * This should generally not be used, - * but we need it for being comliant with the OTEL Span interface. + * but we need it for being compliant with the OTEL Span interface. * * @hidden * @internal @@ -82,7 +82,7 @@ export class SentryNonRecordingSpan implements Span { /** * This should generally not be used, - * but we need it for being comliant with the OTEL Span interface. + * but we need it for being compliant with the OTEL Span interface. * * @hidden * @internal @@ -93,7 +93,7 @@ export class SentryNonRecordingSpan implements Span { /** * This should generally not be used, - * but we need it for being comliant with the OTEL Span interface. + * but we need it for being compliant with the OTEL Span interface. * * @hidden * @internal diff --git a/packages/core/src/utils/parameterize.ts b/packages/core/src/utils/parameterize.ts index 5783a61fa3c9..1ad880618a48 100644 --- a/packages/core/src/utils/parameterize.ts +++ b/packages/core/src/utils/parameterize.ts @@ -1,7 +1,7 @@ import type { ParameterizedString } from '@sentry/types'; /** - * Tagged template function which returns paramaterized representation of the message + * Tagged template function which returns parameterized representation of the message * For example: parameterize`This is a log statement with ${x} and ${y} params`, would return: * "__sentry_template_string__": 'This is a log statement with %s and %s params', * "__sentry_template_values__": ['first', 'second'] diff --git a/packages/core/test/lib/integration.test.ts b/packages/core/test/lib/integration.test.ts index 18b9d1791bc8..3a1a1ae19768 100644 --- a/packages/core/test/lib/integration.test.ts +++ b/packages/core/test/lib/integration.test.ts @@ -35,7 +35,7 @@ type TestCase = [ string, // test name Options['defaultIntegrations'], // default integrations Options['integrations'], // user-provided integrations - Array, // expected resulst + Array, // expected results ]; describe('getIntegrationsToSetup', () => { diff --git a/packages/core/test/lib/tracing/idleSpan.test.ts b/packages/core/test/lib/tracing/idleSpan.test.ts index ff45938646a1..7a59fc790f0a 100644 --- a/packages/core/test/lib/tracing/idleSpan.test.ts +++ b/packages/core/test/lib/tracing/idleSpan.test.ts @@ -115,7 +115,7 @@ describe('startIdleSpan', () => { setCurrentClient(client); client.init(); - // We want to accomodate a bit of drift there, so we ensure this starts earlier... + // We want to accommodate a bit of drift there, so we ensure this starts earlier... const baseTimeInSeconds = Math.floor(Date.now() / 1000) - 9999; const beforeSpanEnd = jest.fn((span: Span) => { @@ -169,7 +169,7 @@ describe('startIdleSpan', () => { setCurrentClient(client); client.init(); - // We want to accomodate a bit of drift there, so we ensure this starts earlier... + // We want to accommodate a bit of drift there, so we ensure this starts earlier... const baseTimeInSeconds = Math.floor(Date.now() / 1000) - 9999; const idleSpan = startIdleSpan({ name: 'idle span', startTime: baseTimeInSeconds }); @@ -249,7 +249,7 @@ describe('startIdleSpan', () => { setCurrentClient(client); client.init(); - // We want to accomodate a bit of drift there, so we ensure this starts earlier... + // We want to accommodate a bit of drift there, so we ensure this starts earlier... const finalTimeout = 99_999; const baseTimeInSeconds = Math.floor(Date.now() / 1000) - 9999; diff --git a/packages/core/test/lib/utils/handleCallbackErrors.test.ts b/packages/core/test/lib/utils/handleCallbackErrors.test.ts index 3c6bb1e19302..08c116e50ceb 100644 --- a/packages/core/test/lib/utils/handleCallbackErrors.test.ts +++ b/packages/core/test/lib/utils/handleCallbackErrors.test.ts @@ -69,7 +69,7 @@ describe('handleCallbackErrors', () => { }); describe('onFinally', () => { - it('triggers after successfuly sync callback', () => { + it('triggers after successful sync callback', () => { const onError = jest.fn(); const onFinally = jest.fn(); diff --git a/packages/core/test/lib/utils/spanUtils.test.ts b/packages/core/test/lib/utils/spanUtils.test.ts index 2a4850947e80..779e75006c86 100644 --- a/packages/core/test/lib/utils/spanUtils.test.ts +++ b/packages/core/test/lib/utils/spanUtils.test.ts @@ -238,7 +238,7 @@ describe('getRootSpan', () => { startSpan({ name: 'inner2' }, inner2 => { expect(getRootSpan(inner2)).toBe(root); - const inactiveSpan = startInactiveSpan({ name: 'inactived' }); + const inactiveSpan = startInactiveSpan({ name: 'inactive' }); expect(getRootSpan(inactiveSpan)).toBe(root); }); }); diff --git a/packages/eslint-config-sdk/src/base.js b/packages/eslint-config-sdk/src/base.js index 6daa79eaeed8..525b24b4a334 100644 --- a/packages/eslint-config-sdk/src/base.js +++ b/packages/eslint-config-sdk/src/base.js @@ -40,7 +40,7 @@ module.exports = { // Although for most codebases inferencing the return type is fine, we explicitly ask to annotate // all functions with a return type. This is so that intent is as clear as possible. We are guarding against - // cases where you accidently refactor a function's return type to be the wrong type. + // cases where you accidentally refactor a function's return type to be the wrong type. '@typescript-eslint/explicit-function-return-type': ['error', { allowExpressions: true }], // Consistent ordering of fields, methods and constructors for classes should be enforced @@ -131,7 +131,7 @@ module.exports = { ], // We want to prevent optional chaining & nullish coalescing usage in our files - // to prevent uncessary bundle size. Turned off in tests. + // to prevent unnecessary bundle size. Turned off in tests. '@sentry-internal/sdk/no-optional-chaining': 'error', '@sentry-internal/sdk/no-nullish-coalescing': 'error', @@ -258,7 +258,7 @@ module.exports = { quotes: ['error', 'single', { avoidEscape: true }], - // Remove uncessary usages of async await to prevent extra micro-tasks + // Remove unnecessary usages of async await to prevent extra micro-tasks 'no-return-await': 'error', }, }; diff --git a/packages/feedback/README.md b/packages/feedback/README.md index 336e74da6593..d2ed35cc8c7d 100644 --- a/packages/feedback/README.md +++ b/packages/feedback/README.md @@ -15,7 +15,7 @@ To view Feedback in Sentry, your ## Installation -Please read the [offical integration documentation](https://docs.sentry.io/platforms/javascript/user-feedback/) for +Please read the [official integration documentation](https://docs.sentry.io/platforms/javascript/user-feedback/) for installation instructions. ## Configuration diff --git a/packages/feedback/src/modal/components/Form.tsx b/packages/feedback/src/modal/components/Form.tsx index cc6f1afd32f6..d6cc94ec7f60 100644 --- a/packages/feedback/src/modal/components/Form.tsx +++ b/packages/feedback/src/modal/components/Form.tsx @@ -61,7 +61,7 @@ export function Form({ submitButtonLabel, isRequiredLabel, } = options; - // TODO: set a ref on the form, and whenever an input changes call proceessForm() and setError() + // TODO: set a ref on the form, and whenever an input changes call processForm() and setError() const [error, setError] = useState(null); const [showScreenshotInput, setShowScreenshotInput] = useState(false); diff --git a/packages/nextjs/rollup.npm.config.mjs b/packages/nextjs/rollup.npm.config.mjs index afe41659238f..7fbacde6fe3c 100644 --- a/packages/nextjs/rollup.npm.config.mjs +++ b/packages/nextjs/rollup.npm.config.mjs @@ -14,7 +14,7 @@ export default [ 'src/config/index.ts', ], - // prevent this internal nextjs code from ending up in our built package (this doesn't happen automatially because + // prevent this internal nextjs code from ending up in our built package (this doesn't happen automatically because // the name doesn't match an SDK dependency) packageSpecificConfig: { external: ['next/router', 'next/constants', 'next/headers', 'stacktrace-parser'], diff --git a/packages/nextjs/src/client/routing/appRouterRoutingInstrumentation.ts b/packages/nextjs/src/client/routing/appRouterRoutingInstrumentation.ts index 741849c481ab..c44ef444fdf7 100644 --- a/packages/nextjs/src/client/routing/appRouterRoutingInstrumentation.ts +++ b/packages/nextjs/src/client/routing/appRouterRoutingInstrumentation.ts @@ -36,7 +36,7 @@ const GLOBAL_OBJ_WITH_NEXT_ROUTER = GLOBAL_OBJ as typeof GLOBAL_OBJ & { nd?: { router?: NextRouter; }; - // Avalable from 13.4.4-canary.4 - https://github.com/vercel/next.js/pull/50210 + // Available from 13.4.4-canary.4 - https://github.com/vercel/next.js/pull/50210 next?: { router?: NextRouter; }; diff --git a/packages/nextjs/src/config/loaders/prefixLoader.ts b/packages/nextjs/src/config/loaders/prefixLoader.ts index a9ca78667b53..29920a7047be 100644 --- a/packages/nextjs/src/config/loaders/prefixLoader.ts +++ b/packages/nextjs/src/config/loaders/prefixLoader.ts @@ -24,7 +24,7 @@ export default function prefixLoader(this: LoaderThis, userCode: const { templatePrefix, replacements } = 'getOptions' in this ? this.getOptions() : this.query; const templatePath = path.resolve(__dirname, `../templates/${templatePrefix}PrefixLoaderTemplate.js`); - // make sure the template is included when runing `webpack watch` + // make sure the template is included when running `webpack watch` this.addDependency(templatePath); // Fill in placeholders diff --git a/packages/nextjs/src/config/loaders/wrappingLoader.ts b/packages/nextjs/src/config/loaders/wrappingLoader.ts index e298a459d16e..d18d0efd7634 100644 --- a/packages/nextjs/src/config/loaders/wrappingLoader.ts +++ b/packages/nextjs/src/config/loaders/wrappingLoader.ts @@ -82,7 +82,7 @@ export default function wrappingLoader( // Get the parameterized route name from this page's filepath const parameterizedPagesRoute = path - // Get the path of the file insde of the pages directory + // Get the path of the file inside of the pages directory .relative(pagesDir, this.resourcePath) // Replace all backslashes with forward slashes (windows) .replace(/\\/g, '/') @@ -124,7 +124,7 @@ export default function wrappingLoader( // Get the parameterized route name from this page's filepath const parameterizedPagesRoute = path - // Get the path of the file insde of the app directory + // Get the path of the file inside of the app directory .relative(appDir, this.resourcePath) // Replace all backslashes with forward slashes (windows) .replace(/\\/g, '/') @@ -281,7 +281,7 @@ async function wrapUserCode( } else if (id === WRAPPING_TARGET_MODULE_NAME) { return { code: userModuleCode, - map: userModuleSourceMap, // give rollup acces to original user module source map + map: userModuleSourceMap, // give rollup access to original user module source map }; } else { return null; @@ -342,7 +342,7 @@ async function wrapUserCode( // This is why we want to avoid unnecessarily creating default exports, even if they're just `undefined`. // For this reason we try to bundle/wrap the user code once including a re-export of `default`. // If the user code didn't have a default export, rollup will throw. - // We then try bundling/wrapping agian, but without including a re-export of `default`. + // We then try bundling/wrapping again, but without including a re-export of `default`. let rollupBuild; try { rollupBuild = await wrap(true); @@ -356,7 +356,7 @@ async function wrapUserCode( const finalBundle = await rollupBuild.generate({ format: 'esm', - sourcemap: 'hidden', // put source map data in the bundle but don't generate a source map commment in the output + sourcemap: 'hidden', // put source map data in the bundle but don't generate a source map comment in the output }); // The module at index 0 is always the entrypoint, which in this case is the proxy module. diff --git a/packages/nextjs/src/config/templates/apiWrapperTemplate.ts b/packages/nextjs/src/config/templates/apiWrapperTemplate.ts index 80b9a4f51d60..da03a0c413d4 100644 --- a/packages/nextjs/src/config/templates/apiWrapperTemplate.ts +++ b/packages/nextjs/src/config/templates/apiWrapperTemplate.ts @@ -25,7 +25,7 @@ type NextApiModule = ( const userApiModule = origModule as NextApiModule; // Default to undefined. It's possible for Next.js users to not define any exports/handlers in an API route. If that is -// the case Next.js wil crash during runtime but the Sentry SDK should definitely not crash so we need tohandle it. +// the case Next.js will crash during runtime but the Sentry SDK should definitely not crash so we need to handle it. let userProvidedHandler = undefined; if ('default' in userApiModule && typeof userApiModule.default === 'function') { @@ -65,6 +65,6 @@ if (wrappedHandler) { export default wrappedHandler; // Re-export anything exported by the page module we're wrapping. When processing this code, Rollup is smart enough to -// not include anything whose name matchs something we've explicitly exported above. +// not include anything whose name matches something we've explicitly exported above. // @ts-expect-error See above export * from '__SENTRY_WRAPPING_TARGET_FILE__'; diff --git a/packages/nextjs/src/config/templates/pageWrapperTemplate.ts b/packages/nextjs/src/config/templates/pageWrapperTemplate.ts index 7ac89ed1931c..2c3f22a597c7 100644 --- a/packages/nextjs/src/config/templates/pageWrapperTemplate.ts +++ b/packages/nextjs/src/config/templates/pageWrapperTemplate.ts @@ -50,6 +50,6 @@ export const getServerSideProps = export default pageComponent ? Sentry.wrapPageComponentWithSentry(pageComponent as unknown) : pageComponent; // Re-export anything exported by the page module we're wrapping. When processing this code, Rollup is smart enough to -// not include anything whose name matchs something we've explicitly exported above. +// not include anything whose name matches something we've explicitly exported above. // @ts-expect-error See above export * from '__SENTRY_WRAPPING_TARGET_FILE__'; diff --git a/packages/nextjs/src/config/templates/serverComponentWrapperTemplate.ts b/packages/nextjs/src/config/templates/serverComponentWrapperTemplate.ts index 364affc08058..d569715e74fc 100644 --- a/packages/nextjs/src/config/templates/serverComponentWrapperTemplate.ts +++ b/packages/nextjs/src/config/templates/serverComponentWrapperTemplate.ts @@ -99,7 +99,7 @@ export const generateViewport = serverComponentModule.generateViewport : undefined; // Re-export anything exported by the page module we're wrapping. When processing this code, Rollup is smart enough to -// not include anything whose name matchs something we've explicitly exported above. +// not include anything whose name matches something we've explicitly exported above. // @ts-expect-error See above export * from '__SENTRY_WRAPPING_TARGET_FILE__'; diff --git a/packages/nextjs/src/config/webpack.ts b/packages/nextjs/src/config/webpack.ts index 9656a74c4efe..79bd230a3ee7 100644 --- a/packages/nextjs/src/config/webpack.ts +++ b/packages/nextjs/src/config/webpack.ts @@ -683,7 +683,7 @@ function addOtelWarningIgnoreRule(newConfig: WebpackConfigObjectWithModuleRules) const ignoreRules = [ // Inspired by @matmannion: https://github.com/getsentry/sentry-javascript/issues/12077#issuecomment-2180307072 (warning, compilation) => { - // This is wapped in try-catch because we are vendoring types for this hook and we can't be 100% sure that we are accessing API that is there + // This is wrapped in try-catch because we are vendoring types for this hook and we can't be 100% sure that we are accessing API that is there try { if (!warning.module) { return false; diff --git a/packages/nextjs/src/index.types.ts b/packages/nextjs/src/index.types.ts index 636d6c49815a..9dc9e84a147a 100644 --- a/packages/nextjs/src/index.types.ts +++ b/packages/nextjs/src/index.types.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ // We export everything from both the client part of the SDK and from the server part. Some of the exports collide, -// which is not allowed, unless we redifine the colliding exports in this file - which we do below. +// which is not allowed, unless we redefine the colliding exports in this file - which we do below. export * from './config'; export * from './client'; export * from './server'; diff --git a/packages/nextjs/test/serverSdk.test.ts b/packages/nextjs/test/serverSdk.test.ts index 27230874d457..1129bcdbbf2b 100644 --- a/packages/nextjs/test/serverSdk.test.ts +++ b/packages/nextjs/test/serverSdk.test.ts @@ -54,7 +54,7 @@ describe('Server init()', () => { // Integrations are tested separately, and we can't be more specific here without depending on the order in // which integrations appear in the array, which we can't guarantee. // - // TODO: If we upgrde to Jest 28+, we can follow Jest's example matcher and create an + // TODO: If we upgrade to Jest 28+, we can follow Jest's example matcher and create an // `expect.ArrayContainingInAnyOrder`. See // https://github.com/facebook/jest/blob/main/examples/expect-extend/toBeWithinRange.ts. defaultIntegrations: expect.any(Array), diff --git a/packages/node/src/integrations/http/index.ts b/packages/node/src/integrations/http/index.ts index 975503956f21..224bd56485a1 100644 --- a/packages/node/src/integrations/http/index.ts +++ b/packages/node/src/integrations/http/index.ts @@ -75,7 +75,7 @@ interface HttpOptions { ) => void; /** - * You can pass any configuration through to the underlying instrumention. + * You can pass any configuration through to the underlying instrumentation. * Note that there are no semver guarantees for this! */ _experimentalConfig?: ConstructorParameters[0]; diff --git a/packages/node/src/integrations/tracing/prisma.ts b/packages/node/src/integrations/tracing/prisma.ts index e5d9e61a0229..c9e7acafb09d 100644 --- a/packages/node/src/integrations/tracing/prisma.ts +++ b/packages/node/src/integrations/tracing/prisma.ts @@ -41,7 +41,7 @@ const _prismaIntegration = (() => { * Prisma integration * * Capture tracing data for prisma. - * Note: This requieres to set: + * Note: This requires to set: * previewFeatures = ["tracing"] * For the prisma client. * See https://www.prisma.io/docs/concepts/components/prisma-client/opentelemetry-tracing for more details. diff --git a/packages/node/src/types.ts b/packages/node/src/types.ts index f6b08a394f8c..7235e2057c34 100644 --- a/packages/node/src/types.ts +++ b/packages/node/src/types.ts @@ -158,7 +158,7 @@ export interface CurrentScopes { * so in these cases we type this as `AbstractSpan` which could be either a regular `Span` or a `ReadableSpan`. * You'll have to make sur to check revelant fields before accessing them. * - * Note that technically, the `Span` exported from `@opentelemwetry/sdk-trace-base` matches this, + * Note that technically, the `Span` exported from `@opentelemetry/sdk-trace-base` matches this, * but we cannot be 100% sure that we are actually getting such a span, so this type is more defensive. */ export type AbstractSpan = WriteableSpan | ReadableSpan | Span; diff --git a/packages/node/test/integration/transactions.test.ts b/packages/node/test/integration/transactions.test.ts index 048496f363b4..5c77b81e6994 100644 --- a/packages/node/test/integration/transactions.test.ts +++ b/packages/node/test/integration/transactions.test.ts @@ -595,7 +595,7 @@ describe('Integration | Transactions', () => { jest.advanceTimersByTime(1); - // Child-spans have been added to the exporter, but they are pending since they are waiting for their parant + // Child-spans have been added to the exporter, but they are pending since they are waiting for their parent expect(exporter['_finishedSpans'].length).toBe(2); expect(beforeSendTransaction).toHaveBeenCalledTimes(0); diff --git a/packages/node/test/sdk/init.test.ts b/packages/node/test/sdk/init.test.ts index 1f904ca528f9..10a7a56ae8bd 100644 --- a/packages/node/test/sdk/init.test.ts +++ b/packages/node/test/sdk/init.test.ts @@ -143,7 +143,7 @@ describe('init()', () => { }); }); - it('returns intiated client', () => { + it('returns initialized client', () => { const client = init({ dsn: PUBLIC_DSN, skipOpenTelemetrySetup: true }); expect(client).toBeInstanceOf(NodeClient); diff --git a/packages/opentelemetry/src/spanExporter.ts b/packages/opentelemetry/src/spanExporter.ts index 5ba28f8b1607..a9fa207ade6b 100644 --- a/packages/opentelemetry/src/spanExporter.ts +++ b/packages/opentelemetry/src/spanExporter.ts @@ -209,7 +209,7 @@ function createTransactionForOtelSpan(span: ReadableSpan): TransactionEvent { const parentSpanIdFromTraceState = span.spanContext().traceState?.get(SENTRY_TRACE_STATE_PARENT_SPAN_ID); - // If parentSpanIdFromTraceState is defined at all, we want it to take presedence + // If parentSpanIdFromTraceState is defined at all, we want it to take precedence // In that case, an empty string should be interpreted as "no parent span id", // even if `span.parentSpanId` is set // this is the case when we are starting a new trace, where we have a virtual span based on the propagationContext @@ -337,7 +337,7 @@ function getSpanData(span: ReadableSpan): { } /** - * Remove custom `sentry.` attribtues we do not need to send. + * Remove custom `sentry.` attributes we do not need to send. * These are more carrier attributes we use inside of the SDK, we do not need to send them to the API. */ function removeSentryAttributes(data: Record): Record { diff --git a/packages/opentelemetry/src/types.ts b/packages/opentelemetry/src/types.ts index 30dd025a3116..341fbea88d38 100644 --- a/packages/opentelemetry/src/types.ts +++ b/packages/opentelemetry/src/types.ts @@ -18,7 +18,7 @@ export interface OpenTelemetrySpanContext extends StartSpanOptions { * so in these cases we type this as `AbstractSpan` which could be either a regular `Span` or a `ReadableSpan`. * You'll have to make sure to check relevant fields before accessing them. * - * Note that technically, the `Span` exported from `@opentelemwetry/sdk-trace-base` matches this, + * Note that technically, the `Span` exported from `@opentelemetry/sdk-trace-base` matches this, * but we cannot be 100% sure that we are actually getting such a span, so this type is more defensive. */ export type AbstractSpan = WriteableSpan | ReadableSpan | Span; diff --git a/packages/opentelemetry/src/utils/isSentryRequest.ts b/packages/opentelemetry/src/utils/isSentryRequest.ts index bbfcefc59d31..c910ec1607bb 100644 --- a/packages/opentelemetry/src/utils/isSentryRequest.ts +++ b/packages/opentelemetry/src/utils/isSentryRequest.ts @@ -6,7 +6,7 @@ import { spanHasAttributes } from './spanTypes'; /** * - * @param otelSpan Checks wheter a given OTEL Span is an http request to sentry. + * @param otelSpan Checks whether a given OTEL Span is an http request to sentry. * @returns boolean */ export function isSentryRequestSpan(span: AbstractSpan): boolean { diff --git a/packages/opentelemetry/test/asyncContextStrategy.test.ts b/packages/opentelemetry/test/asyncContextStrategy.test.ts index f3b664fcaf44..915d33671e68 100644 --- a/packages/opentelemetry/test/asyncContextStrategy.test.ts +++ b/packages/opentelemetry/test/asyncContextStrategy.test.ts @@ -85,7 +85,7 @@ describe('asyncContextStrategy', () => { const initialScope = getCurrentScope(); const initialIsolationScope = getIsolationScope(); - async function asycnSetExtra(scope: Scope, key: string, value: string): Promise { + async function asyncSetExtra(scope: Scope, key: string, value: string): Promise { await new Promise(resolve => setTimeout(resolve, 1)); scope.setExtra(key, value); } @@ -103,8 +103,8 @@ describe('asyncContextStrategy', () => { expect(scope1.getScopeData()).toEqual(initialScope.getScopeData()); expect(isolationScope1.getScopeData()).toEqual(initialIsolationScope.getScopeData()); - await asycnSetExtra(scope1, 'b', 'b'); - await asycnSetExtra(isolationScope1, 'bb', 'bb'); + await asyncSetExtra(scope1, 'b', 'b'); + await asyncSetExtra(isolationScope1, 'bb', 'bb'); await withScope(async () => { const scope2 = getCurrentScope(); @@ -115,7 +115,7 @@ describe('asyncContextStrategy', () => { expect(scope2.getScopeData()).toEqual(scope1.getScopeData()); - await asycnSetExtra(scope2, 'c', 'c'); + await asyncSetExtra(scope2, 'c', 'c'); expect(scope2.getScopeData().extra).toEqual({ a: 'a', @@ -217,7 +217,7 @@ describe('asyncContextStrategy', () => { const initialScope = getCurrentScope(); const initialIsolationScope = getIsolationScope(); - async function asycnSetExtra(scope: Scope, key: string, value: string): Promise { + async function asyncSetExtra(scope: Scope, key: string, value: string): Promise { await new Promise(resolve => setTimeout(resolve, 1)); scope.setExtra(key, value); } @@ -235,8 +235,8 @@ describe('asyncContextStrategy', () => { expect(scope1.getScopeData()).toEqual(initialScope.getScopeData()); expect(isolationScope1.getScopeData()).toEqual(initialIsolationScope.getScopeData()); - await asycnSetExtra(scope1, 'b', 'b'); - await asycnSetExtra(isolationScope1, 'bb', 'bb'); + await asyncSetExtra(scope1, 'b', 'b'); + await asyncSetExtra(isolationScope1, 'bb', 'bb'); await withScope(async () => { const scope2 = getCurrentScope(); @@ -247,7 +247,7 @@ describe('asyncContextStrategy', () => { expect(scope2.getScopeData()).toEqual(scope1.getScopeData()); - await asycnSetExtra(scope2, 'c', 'c'); + await asyncSetExtra(scope2, 'c', 'c'); expect(scope2.getScopeData().extra).toEqual({ a: 'a', diff --git a/packages/opentelemetry/test/integration/transactions.test.ts b/packages/opentelemetry/test/integration/transactions.test.ts index b8e7713cb4ca..bab3f03d1f64 100644 --- a/packages/opentelemetry/test/integration/transactions.test.ts +++ b/packages/opentelemetry/test/integration/transactions.test.ts @@ -476,7 +476,7 @@ describe('Integration | Transactions', () => { await new Promise(resolve => setTimeout(resolve, 10 * 60 * 1000)); }); - // Child-spans have been added to the exporter, but they are pending since they are waiting for their parant + // Child-spans have been added to the exporter, but they are pending since they are waiting for their parent expect(exporter['_finishedSpans'].length).toBe(2); expect(beforeSendTransaction).toHaveBeenCalledTimes(0); diff --git a/packages/opentelemetry/test/propagator.test.ts b/packages/opentelemetry/test/propagator.test.ts index 16848352239a..d3b9483674a1 100644 --- a/packages/opentelemetry/test/propagator.test.ts +++ b/packages/opentelemetry/test/propagator.test.ts @@ -533,7 +533,7 @@ describe('SentryPropagator', () => { ); }); - it('should NOT set baggage and sentry-trace header if instrumentation is supressed', () => { + it('should NOT set baggage and sentry-trace header if instrumentation is suppressed', () => { const spanContext = { traceId: 'd4cda95b652f4a1592b449d5929fda1b', spanId: '6e0c63257de34c92', diff --git a/packages/opentelemetry/test/utils/parseSpanDescription.test.ts b/packages/opentelemetry/test/utils/parseSpanDescription.test.ts index 91de028fdcbe..c44645c62888 100644 --- a/packages/opentelemetry/test/utils/parseSpanDescription.test.ts +++ b/packages/opentelemetry/test/utils/parseSpanDescription.test.ts @@ -142,7 +142,7 @@ describe('parseSpanDescription', () => { describe('descriptionForHttpMethod', () => { it.each([ [ - 'works withhout attributes', + 'works without attributes', 'GET', {}, 'test name', diff --git a/packages/profiling-node/README.md b/packages/profiling-node/README.md index 4357e23bb194..890022ae2e88 100644 --- a/packages/profiling-node/README.md +++ b/packages/profiling-node/README.md @@ -305,7 +305,7 @@ In that case it is possible that the function name may end up being reported to No. All instances of the profiler are scoped per thread In practice, this means that starting a transaction on thread A and delegating work to thread B will only result in sample stacks being collected from thread A. That said, nothing -should prevent you from starting a transaction on thread B concurrently which will result in two independant profiles +should prevent you from starting a transaction on thread B concurrently which will result in two independent profiles being sent to the Sentry backend. We currently do not do any correlation between such transactions, but we would be open to exploring the possibilities. Please file an issue if you have suggestions or specific use-cases in mind. diff --git a/packages/profiling-node/bindings/cpu_profiler.cc b/packages/profiling-node/bindings/cpu_profiler.cc index ad3ca8079e00..d51a1e747e93 100644 --- a/packages/profiling-node/bindings/cpu_profiler.cc +++ b/packages/profiling-node/bindings/cpu_profiler.cc @@ -351,7 +351,7 @@ v8::CpuProfile *SentryProfile::Stop(Profiler *profiler) { v8::NewStringType::kNormal) .ToLocalChecked()); - // Remove the meemory sampler + // Remove the memory sampler profiler->measurements_ticker.remove_heap_listener(id, memory_sampler_cb); profiler->measurements_ticker.remove_cpu_listener(id, cpu_sampler_cb); // If for some reason stopProfiling was called with an invalid profile title diff --git a/packages/profiling-node/scripts/check-build.js b/packages/profiling-node/scripts/check-build.js index 6892d90ba4b3..dda96e66b900 100644 --- a/packages/profiling-node/scripts/check-build.js +++ b/packages/profiling-node/scripts/check-build.js @@ -1,4 +1,4 @@ -// This is a build scripts, so some logging is desireable as it allows +// This is a build script, so some logging is desirable as it allows // us to follow the code path that triggered the error. /* eslint-disable no-console */ const fs = require('fs'); diff --git a/packages/profiling-node/scripts/copy-target.js b/packages/profiling-node/scripts/copy-target.js index ee3b75163724..8277f1d45290 100644 --- a/packages/profiling-node/scripts/copy-target.js +++ b/packages/profiling-node/scripts/copy-target.js @@ -1,4 +1,4 @@ -// This is a build scripts, so some logging is desireable as it allows +// This is a build script, so some logging is desirable as it allows // us to follow the code path that triggered the error. /* eslint-disable no-console */ const fs = require('fs'); diff --git a/packages/profiling-node/scripts/prune-profiler-binaries.js b/packages/profiling-node/scripts/prune-profiler-binaries.js index 925cedaee73a..22fc13ce28b6 100755 --- a/packages/profiling-node/scripts/prune-profiler-binaries.js +++ b/packages/profiling-node/scripts/prune-profiler-binaries.js @@ -1,6 +1,6 @@ #! /usr/bin/env node -// This is a build scripts, so some logging is desireable as it allows +// This is a build script, so some logging is desirable as it allows // us to follow the code path that triggered the error. /* eslint-disable no-console */ const fs = require('fs'); @@ -88,7 +88,7 @@ if (!SOURCE_DIR) { if (!PLATFORM && !ARCH && !STDLIB) { ARGV_ERRORS.push( - `❌ Sentry: Missing argument values, pruning requires either --target_platform, --target_arch or --targer_stdlib to be passed as argument values.\n Example: sentry-prune-profiler-binaries --target_platform=linux --target_arch=x64 --target_stdlib=glibc\n + `❌ Sentry: Missing argument values, pruning requires either --target_platform, --target_arch or --target_stdlib to be passed as argument values.\n Example: sentry-prune-profiler-binaries --target_platform=linux --target_arch=x64 --target_stdlib=glibc\n If you are unsure about the execution environment, you can opt to skip some values, but at least one value must be passed.`, ); } diff --git a/packages/profiling-node/src/cpu_profiler.ts b/packages/profiling-node/src/cpu_profiler.ts index fb739a939e77..51d0279ba31b 100644 --- a/packages/profiling-node/src/cpu_profiler.ts +++ b/packages/profiling-node/src/cpu_profiler.ts @@ -46,7 +46,7 @@ export function importCppBindingsModule(): PrivateV8CpuProfilerBindings { return require(`${binaryPath}.node`); } - // We need the fallthrough so that in the end, we can fallback to the require dynamice require. + // We need the fallthrough so that in the end, we can fallback to the dynamic require. // This is for cases where precompiled binaries were not provided, but may have been compiled from source. if (platform === 'darwin') { if (arch === 'x64') { diff --git a/packages/profiling-node/src/utils.ts b/packages/profiling-node/src/utils.ts index 0eb4fe4281b4..1ec575aaaf3f 100644 --- a/packages/profiling-node/src/utils.ts +++ b/packages/profiling-node/src/utils.ts @@ -364,7 +364,7 @@ export function findProfiledTransactionsFromEnvelope(envelope: Envelope): Event[ const event = item[j]; if (!event) { - // Shouldnt happen, but lets be safe + // Shouldn't happen, but lets be safe continue; } diff --git a/packages/profiling-node/test/bindings.test.ts b/packages/profiling-node/test/bindings.test.ts index c524a277bfa9..27361a87d941 100644 --- a/packages/profiling-node/test/bindings.test.ts +++ b/packages/profiling-node/test/bindings.test.ts @@ -14,7 +14,7 @@ const cases = [ ['/Users/jonas/code/src/file.ts', 'Users.jonas.code.src:file.ts'], // No extension ['/Users/jonas/code/src/file', 'Users.jonas.code.src:file'], - // Edge cases that shouldn't happen in practice, but try and handle them so we dont crash + // Edge cases that shouldn't happen in practice, but try and handle them so we don't crash ['/Users/jonas/code/src/file.js', 'Users.jonas.code.src:file'], ['', ''], ]; diff --git a/packages/profiling-node/test/cpu_profiler.test.ts b/packages/profiling-node/test/cpu_profiler.test.ts index 1e3903be6fc5..b370ae7f96c9 100644 --- a/packages/profiling-node/test/cpu_profiler.test.ts +++ b/packages/profiling-node/test/cpu_profiler.test.ts @@ -234,7 +234,7 @@ describe('Profiler bindings', () => { } expect(sample.timestamp).toBeDefined(); // No older than a minute and not in the future. Timestamp is in seconds so convert to ms - // as the constructor expectes ms. + // as the constructor expects ms. expect(new Date((sample.timestamp as number) * 1e3).getTime()).toBeGreaterThan(Date.now() - 60 * 1e3); expect(new Date((sample.timestamp as number) * 1e3).getTime()).toBeLessThanOrEqual(Date.now()); } diff --git a/packages/profiling-node/test/spanProfileUtils.test.ts b/packages/profiling-node/test/spanProfileUtils.test.ts index fd2c95ec79e4..c5619eaaae85 100644 --- a/packages/profiling-node/test/spanProfileUtils.test.ts +++ b/packages/profiling-node/test/spanProfileUtils.test.ts @@ -556,7 +556,7 @@ describe('continuous profiling', () => { expect(stopProfilingSpy).toHaveBeenCalledTimes(1); }); - it('manullly stopping a chunk doesnt restart the profiler', async () => { + it('manually stopping a chunk doesnt restart the profiler', async () => { const startProfilingSpy = jest.spyOn(CpuProfilerBindings, 'startProfiling'); const stopProfilingSpy = jest.spyOn(CpuProfilerBindings, 'stopProfiling'); diff --git a/packages/react/README.md b/packages/react/README.md index 5645b03d9fb0..066ab7f7c828 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -75,7 +75,7 @@ import React from 'react'; import * as Sentry from '@sentry/react'; function FallbackComponent() { - return
An error has occured
; + return
An error has occurred
; } class App extends React.Component { diff --git a/packages/react/src/profiler.tsx b/packages/react/src/profiler.tsx index 5008ffdc0010..611425b04df0 100644 --- a/packages/react/src/profiler.tsx +++ b/packages/react/src/profiler.tsx @@ -78,8 +78,8 @@ class Profiler extends React.Component { // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive. // We are just trying to give baseline clues for further investigation. if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) { - // See what props haved changed between the previous props, and the current props. This is - // set as data on the span. We just store the prop keys as the values could be potenially very large. + // See what props have changed between the previous props, and the current props. This is + // set as data on the span. We just store the prop keys as the values could be potentially very large. const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]); if (changedProps.length > 0) { const now = timestampInSeconds(); diff --git a/packages/react/src/reactrouter.tsx b/packages/react/src/reactrouter.tsx index d52885dffa8d..1b9102273e9c 100644 --- a/packages/react/src/reactrouter.tsx +++ b/packages/react/src/reactrouter.tsx @@ -20,7 +20,7 @@ import type { ReactElement } from 'react'; import type { Action, Location } from './types'; -// We need to disable eslint no-explict-any because any is required for the +// We need to disable eslint no-explicit-any because any is required for the // react-router typings. type Match = { path: string; url: string; params: Record; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any diff --git a/packages/react/src/reactrouterv6.tsx b/packages/react/src/reactrouterv6.tsx index 400028a28789..1ec1ae4b7d35 100644 --- a/packages/react/src/reactrouterv6.tsx +++ b/packages/react/src/reactrouterv6.tsx @@ -170,7 +170,7 @@ function getNormalizedName( if ( // If the route defined on the element is something like // Product} /> - // We should check against the branch.pathname for the number of / seperators + // We should check against the branch.pathname for the number of / separators getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) && // We should not count wildcard operators in the url segments calculation pathBuilder.slice(-2) !== '/*' @@ -266,7 +266,7 @@ export function withSentryReactRouterV6Routing

, R handleNavigation(location, routes, navigationType); } }, - // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect + // `props.children` is purposely not included in the dependency array, because we do not want to re-run this effect // when the children change. We only want to start transactions when the location or navigation type change. [location, navigationType], ); diff --git a/packages/react/src/types.ts b/packages/react/src/types.ts index 9c81f63cc0d5..1a40ec4fce91 100644 --- a/packages/react/src/types.ts +++ b/packages/react/src/types.ts @@ -64,7 +64,7 @@ export type UseLocation = () => Location; export type UseNavigationType = () => Action; // For both of these types, use `any` instead of `RouteObject[]` or `RouteMatch[]`. -// Have to do this so we maintain backwards compatability between +// Have to do this so we maintain backwards compatibility between // react-router > 6.0.0 and >= 6.4.2. export type RouteObjectArrayAlias = any; export type RouteMatchAlias = any; diff --git a/packages/react/test/reactrouterv6.test.tsx b/packages/react/test/reactrouterv6.test.tsx index d584bcfa22c1..fbb135a5449c 100644 --- a/packages/react/test/reactrouterv6.test.tsx +++ b/packages/react/test/reactrouterv6.test.tsx @@ -268,7 +268,7 @@ describe('reactRouterV6BrowserTracingIntegration', () => { }); }); - it('works with paramaterized paths', () => { + it('works with parameterized paths', () => { const client = createMockBrowserClient(); setCurrentClient(client); @@ -663,7 +663,7 @@ describe('reactRouterV6BrowserTracingIntegration', () => { }); }); - it('works with paramaterized paths', () => { + it('works with parameterized paths', () => { const client = createMockBrowserClient(); setCurrentClient(client); diff --git a/packages/remix/src/index.types.ts b/packages/remix/src/index.types.ts index b7b7bd9d9a73..46052b99473d 100644 --- a/packages/remix/src/index.types.ts +++ b/packages/remix/src/index.types.ts @@ -1,5 +1,5 @@ // We export everything from both the client part of the SDK and from the server part. Some of the exports collide, -// which is not allowed, unless we redifine the colliding exports in this file - which we do below. +// which is not allowed, unless we redefine the colliding exports in this file - which we do below. export * from './index.client'; export * from './index.server'; diff --git a/packages/replay-internal/README.md b/packages/replay-internal/README.md index 90ddb5b78110..b08aad64b21e 100644 --- a/packages/replay-internal/README.md +++ b/packages/replay-internal/README.md @@ -107,7 +107,7 @@ Sentry.init({ const client = Sentry.getClient(); -// Add replay integration, will start recoring +// Add replay integration, will start recording client?.addIntegration(replay); // Stop recording diff --git a/packages/replay-internal/src/coreHandlers/handleClick.ts b/packages/replay-internal/src/coreHandlers/handleClick.ts index 029588764610..6be19626315c 100644 --- a/packages/replay-internal/src/coreHandlers/handleClick.ts +++ b/packages/replay-internal/src/coreHandlers/handleClick.ts @@ -66,7 +66,7 @@ export class ClickDetector implements ReplayClickDetector { private _teardown: undefined | (() => void); private _threshold: number; - private _scollTimeout: number; + private _scrollTimeout: number; private _timeout: number; private _ignoreSelector: string; @@ -87,7 +87,7 @@ export class ClickDetector implements ReplayClickDetector { // We want everything in s, but options are in ms this._timeout = slowClickConfig.timeout / 1000; this._threshold = slowClickConfig.threshold / 1000; - this._scollTimeout = slowClickConfig.scrollTimeout / 1000; + this._scrollTimeout = slowClickConfig.scrollTimeout / 1000; this._replay = replay; this._ignoreSelector = slowClickConfig.ignoreSelector; this._addBreadcrumbEvent = _addBreadcrumbEvent; @@ -216,7 +216,7 @@ export class ClickDetector implements ReplayClickDetector { /** Generate matching breadcrumb(s) for the click. */ private _generateBreadcrumbs(click: Click): void { const replay = this._replay; - const hadScroll = click.scrollAfter && click.scrollAfter <= this._scollTimeout; + const hadScroll = click.scrollAfter && click.scrollAfter <= this._scrollTimeout; const hadMutation = click.mutationAfter && click.mutationAfter <= this._threshold; const isSlowClick = !hadScroll && !hadMutation; diff --git a/packages/replay-internal/src/coreHandlers/util/fetchUtils.ts b/packages/replay-internal/src/coreHandlers/util/fetchUtils.ts index f218f4ab9b35..8da058674516 100644 --- a/packages/replay-internal/src/coreHandlers/util/fetchUtils.ts +++ b/packages/replay-internal/src/coreHandlers/util/fetchUtils.ts @@ -26,7 +26,7 @@ import { /** * Capture a fetch breadcrumb to a replay. - * This adds additional data (where approriate). + * This adds additional data (where appropriate). */ export async function captureFetchBreadcrumbToReplay( breadcrumb: Breadcrumb & { data: FetchBreadcrumbData }, diff --git a/packages/replay-internal/src/coreHandlers/util/shouldSampleForBufferEvent.ts b/packages/replay-internal/src/coreHandlers/util/shouldSampleForBufferEvent.ts index 736d296e2d95..2144aab4182c 100644 --- a/packages/replay-internal/src/coreHandlers/util/shouldSampleForBufferEvent.ts +++ b/packages/replay-internal/src/coreHandlers/util/shouldSampleForBufferEvent.ts @@ -6,7 +6,7 @@ import { isSampled } from '../../util/isSampled'; /** * Determine if event should be sampled (only applies in buffer mode). - * When an event is captured by `hanldleGlobalEvent`, when in buffer mode + * When an event is captured by `handleGlobalEvent`, when in buffer mode * we determine if we want to sample the error or not. */ export function shouldSampleForBufferEvent(replay: ReplayContainer, event: Event): boolean { diff --git a/packages/replay-internal/src/coreHandlers/util/xhrUtils.ts b/packages/replay-internal/src/coreHandlers/util/xhrUtils.ts index 52b6cafdfec7..d7ac201c0756 100644 --- a/packages/replay-internal/src/coreHandlers/util/xhrUtils.ts +++ b/packages/replay-internal/src/coreHandlers/util/xhrUtils.ts @@ -25,7 +25,7 @@ import { /** * Capture an XHR breadcrumb to a replay. - * This adds additional data (where approriate). + * This adds additional data (where appropriate). */ export async function captureXhrBreadcrumbToReplay( breadcrumb: Breadcrumb & { data: XhrBreadcrumbData }, diff --git a/packages/replay-internal/src/eventBuffer/EventBufferCompressionWorker.ts b/packages/replay-internal/src/eventBuffer/EventBufferCompressionWorker.ts index 90a54bbf07f3..8ca7f3caccca 100644 --- a/packages/replay-internal/src/eventBuffer/EventBufferCompressionWorker.ts +++ b/packages/replay-internal/src/eventBuffer/EventBufferCompressionWorker.ts @@ -39,7 +39,7 @@ export class EventBufferCompressionWorker implements EventBuffer { /** * Ensure the worker is ready (or not). - * This will either resolve when the worker is ready, or reject if an error occured. + * This will either resolve when the worker is ready, or reject if an error occurred. */ public ensureReady(): Promise { return this._worker.ensureReady(); @@ -55,7 +55,7 @@ export class EventBufferCompressionWorker implements EventBuffer { /** * Add an event to the event buffer. * - * Returns true if event was successfuly received and processed by worker. + * Returns true if event was successfully received and processed by worker. */ public addEvent(event: RecordingEvent): Promise { const timestamp = timestampToMs(event.timestamp); diff --git a/packages/replay-internal/src/eventBuffer/WorkerHandler.ts b/packages/replay-internal/src/eventBuffer/WorkerHandler.ts index 2ccc3ee94b3c..062ed384674b 100644 --- a/packages/replay-internal/src/eventBuffer/WorkerHandler.ts +++ b/packages/replay-internal/src/eventBuffer/WorkerHandler.ts @@ -18,7 +18,7 @@ export class WorkerHandler { /** * Ensure the worker is ready (or not). - * This will either resolve when the worker is ready, or reject if an error occured. + * This will either resolve when the worker is ready, or reject if an error occurred. */ public ensureReady(): Promise { // Ensure we only check once diff --git a/packages/replay-internal/src/replay.ts b/packages/replay-internal/src/replay.ts index 0976b7d57870..d87a73a7e51d 100644 --- a/packages/replay-internal/src/replay.ts +++ b/packages/replay-internal/src/replay.ts @@ -640,7 +640,7 @@ export class ReplayContainer implements ReplayContainerInterface { /** * Always flush via `_debouncedFlush` so that we do not have flushes triggered * from calling both `flush` and `_debouncedFlush`. Otherwise, there could be - * cases of mulitple flushes happening closely together. + * cases of multiple flushes happening closely together. */ public flushImmediate(): Promise { this._debouncedFlush(); @@ -655,7 +655,7 @@ export class ReplayContainer implements ReplayContainerInterface { this._debouncedFlush.cancel(); } - /** Get the current sesion (=replay) ID */ + /** Get the current session (=replay) ID */ public getSessionId(): string | undefined { return this.session && this.session.id; } @@ -1155,7 +1155,7 @@ export class ReplayContainer implements ReplayContainerInterface { const timestamp = Date.now(); // Check total duration again, to avoid sending outdated stuff - // We leave 30s wiggle room to accomodate late flushing etc. + // We leave 30s wiggle room to accommodate late flushing etc. // This _could_ happen when the browser is suspended during flushing, in which case we just want to stop if (timestamp - this._context.initialTimestamp > this._options.maxReplayDuration + 30_000) { throw new Error('Session is too long, not sending replay'); diff --git a/packages/replay-internal/src/types/rrweb.ts b/packages/replay-internal/src/types/rrweb.ts index cb194e193a5d..60e562cadf55 100644 --- a/packages/replay-internal/src/types/rrweb.ts +++ b/packages/replay-internal/src/types/rrweb.ts @@ -20,7 +20,7 @@ export type ReplayEventType = /** * This is a partial copy of rrweb's eventWithTime type which only contains the properties - * we specifcally need in the SDK. + * we specifically need in the SDK. */ export type ReplayEventWithTime = { type: ReplayEventType; diff --git a/packages/replay-internal/src/util/addEvent.ts b/packages/replay-internal/src/util/addEvent.ts index 700627cf954f..3a245242e608 100644 --- a/packages/replay-internal/src/util/addEvent.ts +++ b/packages/replay-internal/src/util/addEvent.ts @@ -126,7 +126,7 @@ function maybeApplyCallback( } } catch (error) { DEBUG_BUILD && - logger.exception(error, 'An error occured in the `beforeAddRecordingEvent` callback, skipping the event...'); + logger.exception(error, 'An error occurred in the `beforeAddRecordingEvent` callback, skipping the event...'); return null; } diff --git a/packages/replay-internal/src/util/maskAttribute.ts b/packages/replay-internal/src/util/maskAttribute.ts index c74c2dc8121a..12daaeb97dff 100644 --- a/packages/replay-internal/src/util/maskAttribute.ts +++ b/packages/replay-internal/src/util/maskAttribute.ts @@ -25,7 +25,7 @@ export function maskAttribute({ return value; } - // unmaskTextSelector takes precendence + // unmaskTextSelector takes precedence if (privacyOptions.unmaskTextSelector && el.matches(privacyOptions.unmaskTextSelector)) { return value; } diff --git a/packages/replay-internal/test/integration/earlyEvents.test.ts b/packages/replay-internal/test/integration/earlyEvents.test.ts index 11dcb7295c0e..d89103166765 100644 --- a/packages/replay-internal/test/integration/earlyEvents.test.ts +++ b/packages/replay-internal/test/integration/earlyEvents.test.ts @@ -35,7 +35,7 @@ describe('Integration | early events', () => { expect(initialTimestamp).not.toEqual(earlyTimeStampSeconds * 1000); - // A performance entry that happend before should not extend the session when we manually started + // A performance entry that happened before should not extend the session when we manually started replay.replayPerformanceEntries.push({ type: 'largest-contentful-paint', name: 'largest-contentful-paint', diff --git a/packages/replay-internal/test/unit/coreHandlers/handleClick.test.ts b/packages/replay-internal/test/unit/coreHandlers/handleClick.test.ts index c2e46722941e..4cd75a609ec3 100644 --- a/packages/replay-internal/test/unit/coreHandlers/handleClick.test.ts +++ b/packages/replay-internal/test/unit/coreHandlers/handleClick.test.ts @@ -311,7 +311,7 @@ describe('Unit | coreHandlers | handleClick', () => { vi.advanceTimersByTime(500); - // Pretend a mutation happend + // Pretend a mutation happened detector['_lastMutation'] = BASE_TIMESTAMP / 1000 + 0.5; expect(mockAddBreadcrumbEvent).toHaveBeenCalledTimes(0); @@ -335,7 +335,7 @@ describe('Unit | coreHandlers | handleClick', () => { vi.advanceTimersByTime(1_000); - // Pretend a mutation happend + // Pretend a mutation happened detector['_lastMutation'] = BASE_TIMESTAMP / 1000 + 2; expect(mockAddBreadcrumbEvent).toHaveBeenCalledTimes(0); @@ -376,7 +376,7 @@ describe('Unit | coreHandlers | handleClick', () => { vi.advanceTimersByTime(1_000); - // Pretend a mutation happend + // Pretend a mutation happened detector['_lastMutation'] = BASE_TIMESTAMP / 1000 + 5; expect(mockAddBreadcrumbEvent).toHaveBeenCalledTimes(0); @@ -443,7 +443,7 @@ describe('Unit | coreHandlers | handleClick', () => { vi.advanceTimersByTime(100); - // Pretend a mutation happend + // Pretend a mutation happened detector['_lastScroll'] = BASE_TIMESTAMP / 1000 + 0.15; expect(mockAddBreadcrumbEvent).toHaveBeenCalledTimes(0); @@ -467,7 +467,7 @@ describe('Unit | coreHandlers | handleClick', () => { vi.advanceTimersByTime(300); - // Pretend a mutation happend + // Pretend a mutation happened detector['_lastScroll'] = BASE_TIMESTAMP / 1000 + 0.3; expect(mockAddBreadcrumbEvent).toHaveBeenCalledTimes(0); diff --git a/packages/replay-internal/test/unit/coreHandlers/handleKeyboardEvent.test.ts b/packages/replay-internal/test/unit/coreHandlers/handleKeyboardEvent.test.ts index 4e438173d3cd..be7764eaa327 100644 --- a/packages/replay-internal/test/unit/coreHandlers/handleKeyboardEvent.test.ts +++ b/packages/replay-internal/test/unit/coreHandlers/handleKeyboardEvent.test.ts @@ -21,7 +21,7 @@ describe('Unit | coreHandlers | handleKeyboardEvent', () => { }); it('returns null for event on contenteditable div', function () { - // JSOM does not support contentEditable properly :( + // JSDOM does not support contentEditable properly :( const target = document.createElement('div'); Object.defineProperty(target, 'isContentEditable', { get: function () { diff --git a/packages/replay-internal/test/unit/coreHandlers/util/networkUtils.test.ts b/packages/replay-internal/test/unit/coreHandlers/util/networkUtils.test.ts index 4158c8bfe7a9..00db91815a5f 100644 --- a/packages/replay-internal/test/unit/coreHandlers/util/networkUtils.test.ts +++ b/packages/replay-internal/test/unit/coreHandlers/util/networkUtils.test.ts @@ -38,7 +38,7 @@ describe('Unit | coreHandlers | util | networkUtils', () => { it('works with string body', () => { expect(getBodySize('abcd')).toBe(4); - // Emojis are correctly counted as mutliple characters + // Emojis are correctly counted as multiple characters expect(getBodySize('With emoji: 😈')).toBe(16); }); diff --git a/packages/replay-internal/test/unit/util/debounce.test.ts b/packages/replay-internal/test/unit/util/debounce.test.ts index a9a8f332a2f5..56d97621a030 100644 --- a/packages/replay-internal/test/unit/util/debounce.test.ts +++ b/packages/replay-internal/test/unit/util/debounce.test.ts @@ -35,7 +35,7 @@ describe('Unit | util | debounce', () => { expect(callback).not.toHaveBeenCalled(); vi.advanceTimersByTime(49); - // at this time, the callback shouldn't be invoked and with a new call, it should be devounced further. + // at this time, the callback shouldn't be invoked and with a new call, it should be debounced further. debouncedCallback(); expect(callback).not.toHaveBeenCalled(); diff --git a/packages/replay-worker/README.md b/packages/replay-worker/README.md index 29d39df52d67..ae8a751b3560 100644 --- a/packages/replay-worker/README.md +++ b/packages/replay-worker/README.md @@ -15,5 +15,5 @@ By extracting this into a dedicated (private, internal) package, we can streamli You can find an example worker for if you want to self-host the compression worker in [/examples](./examples/). -This is generated from the actual soure via `yarn build:examples`, which should be run manually whenever replay-worker +This is generated from the actual source via `yarn build:examples`, which should be run manually whenever replay-worker is updated. diff --git a/packages/solidstart/README.md b/packages/solidstart/README.md index ceda55838e8d..c43ac54c7037 100644 --- a/packages/solidstart/README.md +++ b/packages/solidstart/README.md @@ -28,7 +28,7 @@ functionality related to SolidStart. If the setup through the wizard doesn't work for you, you can also set up the SDK manually. -### 1. Prerequesits & Installation +### 1. Prerequisites & Installation Install the Sentry SolidStart SDK: diff --git a/packages/solidstart/rollup.npm.config.mjs b/packages/solidstart/rollup.npm.config.mjs index b0087a93c6fe..6723ed69845b 100644 --- a/packages/solidstart/rollup.npm.config.mjs +++ b/packages/solidstart/rollup.npm.config.mjs @@ -13,7 +13,7 @@ export default makeNPMConfigVariants( 'src/client/solidrouter.ts', 'src/server/solidrouter.ts', ], - // prevent this internal code from ending up in our built package (this doesn't happen automatially because + // prevent this internal code from ending up in our built package (this doesn't happen automatically because // the name doesn't match an SDK dependency) packageSpecificConfig: { external: ['solid-js/web', 'solid-js', '@sentry/solid', '@sentry/solid/solidrouter'], diff --git a/packages/svelte/src/sdk.ts b/packages/svelte/src/sdk.ts index 721051fc2418..aa40e5a25a98 100644 --- a/packages/svelte/src/sdk.ts +++ b/packages/svelte/src/sdk.ts @@ -49,7 +49,7 @@ export function detectAndReportSvelteKit(): void { /** * To actually detect a SvelteKit frontend, we search the DOM for a special - * div that's inserted by SvelteKit when the page is rendered. It's identifyed + * div that's inserted by SvelteKit when the page is rendered. It's identified * by its id, 'svelte-announcer', and it's used to improve page accessibility. * This div is not present when only using Svelte without SvelteKit. * diff --git a/packages/svelte/src/types.ts b/packages/svelte/src/types.ts index ed7fcfaa4928..8079019d8568 100644 --- a/packages/svelte/src/types.ts +++ b/packages/svelte/src/types.ts @@ -25,7 +25,7 @@ export type SentrySvelteConfigOptions = { export type SpanOptions = { /** - * If true, a span is recorded between a component's intialization and its + * If true, a span is recorded between a component's initialization and its * onMount lifecycle hook. This span tells how long it takes a component * to be created and inserted into the DOM. * diff --git a/packages/sveltekit/src/client/load.ts b/packages/sveltekit/src/client/load.ts index 3b3fba05fb07..6f0e84ef140f 100644 --- a/packages/sveltekit/src/client/load.ts +++ b/packages/sveltekit/src/client/load.ts @@ -45,7 +45,7 @@ function sendErrorToSentry(e: unknown): unknown { * * - catch errors happening during the execution of `load` * - create a load span if performance monitoring is enabled - * - attach tracing Http headers to `fech` requests if performance monitoring is enabled to get connected traces. + * - attach tracing Http headers to `fetch` requests if performance monitoring is enabled to get connected traces. * - add a fetch breadcrumb for every `fetch` request * * Note that tracing Http headers are only attached if the url matches the specified `tracePropagationTargets` diff --git a/packages/sveltekit/src/index.types.ts b/packages/sveltekit/src/index.types.ts index bdd8a23c3c70..f7f0db30a249 100644 --- a/packages/sveltekit/src/index.types.ts +++ b/packages/sveltekit/src/index.types.ts @@ -1,5 +1,5 @@ // We export everything from both the client part of the SDK and from the server part. -// Some of the exports collide, which is not allowed, unless we redifine the colliding +// Some of the exports collide, which is not allowed, unless we redefine the colliding // exports in this file - which we do below. export * from './client'; export * from './vite'; diff --git a/packages/sveltekit/src/vite/autoInstrument.ts b/packages/sveltekit/src/vite/autoInstrument.ts index 708f3c5fc7dc..28e903d89db7 100644 --- a/packages/sveltekit/src/vite/autoInstrument.ts +++ b/packages/sveltekit/src/vite/autoInstrument.ts @@ -78,7 +78,7 @@ export function makeAutoInstrumentationPlugin(options: AutoInstrumentPluginOptio /** * We only want to apply our wrapper to files that * - * - Have no Sentry code yet in them. This is to avoid double-wrapping or interferance with custom + * - Have no Sentry code yet in them. This is to avoid double-wrapping or interfering with custom * Sentry calls. * - Actually declare a `load` function. The second check of course is not 100% accurate, but it's good enough. * Injecting our wrapper into files that don't declare a `load` function would result in a build-time warning diff --git a/packages/sveltekit/src/vite/detectAdapter.ts b/packages/sveltekit/src/vite/detectAdapter.ts index ac9dce2bf8a9..7717aa4bd4c2 100644 --- a/packages/sveltekit/src/vite/detectAdapter.ts +++ b/packages/sveltekit/src/vite/detectAdapter.ts @@ -41,7 +41,7 @@ export async function detectAdapter(debug?: boolean): Promise { const pkgFile = path.join(process.cwd(), 'package.json'); diff --git a/packages/sveltekit/src/vite/sourceMaps.ts b/packages/sveltekit/src/vite/sourceMaps.ts index d228eb6da30e..d0faf85addbd 100644 --- a/packages/sveltekit/src/vite/sourceMaps.ts +++ b/packages/sveltekit/src/vite/sourceMaps.ts @@ -105,7 +105,7 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug const sourceMapsPreviouslyNotEnabled = !config.build?.sourcemap; if (debug && sourceMapsPreviouslyNotEnabled) { // eslint-disable-next-line no-console - console.log('[Source Maps Plugin] Enabeling source map generation'); + console.log('[Source Maps Plugin] Enabling source map generation'); if (!mergedOptions.sourcemaps?.filesToDeleteAfterUpload) { // eslint-disable-next-line no-console console.warn( diff --git a/packages/sveltekit/src/vite/svelteConfig.ts b/packages/sveltekit/src/vite/svelteConfig.ts index e50f8b10a2c3..9186e46caba6 100644 --- a/packages/sveltekit/src/vite/svelteConfig.ts +++ b/packages/sveltekit/src/vite/svelteConfig.ts @@ -46,7 +46,7 @@ export function getHooksFileName(svelteConfig: Config, hookType: 'client' | 'ser } /** - * Attempts to read a custom output directory that can be specidied in the options + * Attempts to read a custom output directory that can be specified in the options * of a SvelteKit adapter. If no custom output directory is specified, the default * directory is returned. */ diff --git a/packages/sveltekit/src/vite/types.ts b/packages/sveltekit/src/vite/types.ts index 7102971375d4..0f6717a2c7e9 100644 --- a/packages/sveltekit/src/vite/types.ts +++ b/packages/sveltekit/src/vite/types.ts @@ -178,7 +178,7 @@ export type SentrySvelteKitPluginOptions = { /** * The Sentry plugin will automatically instrument certain parts of your SvelteKit application at build time. - * Set this option to `false` to disable this behavior or what is instrumentated by passing an object. + * Set this option to `false` to disable this behavior or what is intrumented by passing an object. * * Auto instrumentation includes: * - Universal `load` functions in `+page.(js|ts)` files diff --git a/packages/sveltekit/test/client/browserTracingIntegration.test.ts b/packages/sveltekit/test/client/browserTracingIntegration.test.ts index 6d052cc77b50..a21dbbe66bae 100644 --- a/packages/sveltekit/test/client/browserTracingIntegration.test.ts +++ b/packages/sveltekit/test/client/browserTracingIntegration.test.ts @@ -291,7 +291,7 @@ describe('browserTracingIntegration', () => { // @ts-expect-error - the fakeClient doesn't satisfy Client but that's fine integration.afterAllSetup(fakeClient); - // window.location.pathame is "/" in tests + // window.location.pathname is "/" in tests // @ts-expect-error - page is a writable but the types say it's just readable navigating.set({ diff --git a/packages/sveltekit/test/server/handle.test.ts b/packages/sveltekit/test/server/handle.test.ts index 7b5b86d541b2..c25b926c7ace 100644 --- a/packages/sveltekit/test/server/handle.test.ts +++ b/packages/sveltekit/test/server/handle.test.ts @@ -163,7 +163,7 @@ describe('sentryHandle', () => { await sentryHandle()({ event: mockEvent(), resolve: async _ => { - // simulateing a nested load call: + // simulating a nested load call: await sentryHandle()({ event: mockEvent({ route: { id: 'api/users/details/[id]', isSubRequest: true } }), resolve: resolve(type, isError), @@ -210,7 +210,7 @@ describe('sentryHandle', () => { await sentryHandle()({ event: mockEvent(), resolve: async _ => { - // simulateing a nested load call: + // simulating a nested load call: await sentryHandle()({ event: mockEvent({ route: { id: 'api/users/details/[id]' } }), resolve: resolve(type, isError), diff --git a/packages/types/src/client.ts b/packages/types/src/client.ts index 94f28f9157aa..06e3109e1e14 100644 --- a/packages/types/src/client.ts +++ b/packages/types/src/client.ts @@ -303,7 +303,7 @@ export interface Client { */ on(hook: 'close', callback: () => void): () => void; - /** Fire a hook whener a span starts. */ + /** Fire a hook whenever a span starts. */ emit(hook: 'spanStart', span: Span): void; /** A hook that is called every time before a span is sampled. */ @@ -318,7 +318,7 @@ export interface Client { samplingDecision: { decision: boolean }, ): void; - /** Fire a hook whener a span ends. */ + /** Fire a hook whenever a span ends. */ emit(hook: 'spanEnd', span: Span): void; /** diff --git a/packages/types/src/feedback/config.ts b/packages/types/src/feedback/config.ts index 0b9548b5712e..4ec846c7d98d 100644 --- a/packages/types/src/feedback/config.ts +++ b/packages/types/src/feedback/config.ts @@ -168,7 +168,7 @@ export interface FeedbackTextConfiguration { isRequiredLabel: string; /** - * The label for the button that adds a screeshot and renders the image editor + * The label for the button that adds a screenshot and renders the image editor */ addScreenshotButtonLabel: string; diff --git a/packages/types/src/mechanism.ts b/packages/types/src/mechanism.ts index 9d3dc86e7382..8d34fdcb26eb 100644 --- a/packages/types/src/mechanism.ts +++ b/packages/types/src/mechanism.ts @@ -50,7 +50,7 @@ export interface Mechanism { exception_id?: number; /** - * References another exception via the `exception_id` field to indicate that this excpetion is a child of that + * References another exception via the `exception_id` field to indicate that this exception is a child of that * exception in the case of aggregate or linked errors. */ parent_id?: number; diff --git a/packages/types/src/scope.ts b/packages/types/src/scope.ts index a4b91f4b5d96..2d5c72230aef 100644 --- a/packages/types/src/scope.ts +++ b/packages/types/src/scope.ts @@ -235,7 +235,7 @@ export interface Scope { * Capture an exception for this scope. * * @param exception The exception to capture. - * @param hint Optinal additional data to attach to the Sentry event. + * @param hint Optional additional data to attach to the Sentry event. * @returns the id of the captured Sentry event. */ captureException(exception: unknown, hint?: EventHint): string; diff --git a/packages/utils/src/browser.ts b/packages/utils/src/browser.ts index ce00f2556d05..b3a5220e7c3c 100644 --- a/packages/utils/src/browser.ts +++ b/packages/utils/src/browser.ts @@ -143,7 +143,7 @@ export function getLocationHref(): string { /** * Gets a DOM element by using document.querySelector. * - * This wrapper will first check for the existance of the function before + * This wrapper will first check for the existence of the function before * actually calling it so that we don't have to take care of this check, * every time we want to access the DOM. * @@ -167,7 +167,7 @@ export function getDomElement(selector: string): E | null { /** * Given a DOM element, traverses up the tree until it finds the first ancestor node * that has the `data-sentry-component` or `data-sentry-element` attribute with `data-sentry-component` taking - * precendence. This attribute is added at build-time by projects that have the component name annotation plugin installed. + * precedence. This attribute is added at build-time by projects that have the component name annotation plugin installed. * * @returns a string representation of the component for the provided DOM element, or `null` if not found */ diff --git a/packages/utils/src/buildPolyfills/README.md b/packages/utils/src/buildPolyfills/README.md index bdae9c65c89d..3b18ad989133 100644 --- a/packages/utils/src/buildPolyfills/README.md +++ b/packages/utils/src/buildPolyfills/README.md @@ -8,7 +8,7 @@ which can lead to a great deal of duplication. For our builds, we have therefore polyfills injected in multiple places, we instead replace each injected function with an `import` or `require` statement. -Note that not all polyfills are currently used by the SDK, but all are included here for future compatitibility, should +Note that not all polyfills are currently used by the SDK, but all are included here for future compatibility, should they ever be needed. Also, since we're never going to be calling these directly from within another TS file, their types are fairly generic. In some cases testing required more specific types, which can be found in the test files. diff --git a/packages/utils/src/envelope.ts b/packages/utils/src/envelope.ts index 8bf29788edf0..945bd4d66366 100644 --- a/packages/utils/src/envelope.ts +++ b/packages/utils/src/envelope.ts @@ -117,7 +117,7 @@ export function serializeEnvelope(envelope: Envelope): string | Uint8Array { try { stringifiedPayload = JSON.stringify(payload); } catch (e) { - // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.strinify()` still + // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still // fails, we try again after normalizing it again with infinite normalization depth. This of course has a // performance impact but in this case a performance hit is better than throwing. stringifiedPayload = JSON.stringify(normalize(payload)); diff --git a/packages/utils/src/normalize.ts b/packages/utils/src/normalize.ts index 18b41f1c9357..e88b1edd8513 100644 --- a/packages/utils/src/normalize.ts +++ b/packages/utils/src/normalize.ts @@ -29,7 +29,7 @@ type ObjOrArray = { [key: string]: T }; * @param input The object to be normalized. * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.) * @param maxProperties The max number of elements or properties to be included in any single array or - * object in the normallized output. + * object in the normalized output. * @returns A normalized version of the object, or `"**non-serializable**"` if any errors are thrown during normalization. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/utils/src/object.ts b/packages/utils/src/object.ts index 0ff9b32da402..e0424f6aa120 100644 --- a/packages/utils/src/object.ts +++ b/packages/utils/src/object.ts @@ -98,7 +98,7 @@ export function urlEncode(object: { [key: string]: any }): string { * non-enumerable properties attached. * * @param value Initial source that we have to transform in order for it to be usable by the serializer - * @returns An Event or Error turned into an object - or the value argurment itself, when value is neither an Event nor + * @returns An Event or Error turned into an object - or the value argument itself, when value is neither an Event nor * an Error. */ export function convertToPlainObject( diff --git a/packages/utils/test/string.test.ts b/packages/utils/test/string.test.ts index bb49a7833a11..64870c07fcba 100644 --- a/packages/utils/test/string.test.ts +++ b/packages/utils/test/string.test.ts @@ -38,7 +38,7 @@ describe('isMatchingPattern()', () => { expect(isMatchingPattern('foobar', 'nope', true)).toEqual(false); }); - test('matches when `value` constains `pattern` but not vice-versa', () => { + test('matches when `value` contains `pattern` but not vice-versa', () => { expect(isMatchingPattern('foobar', 'foo')).toEqual(true); expect(isMatchingPattern('foobar', 'foobarbaz')).toEqual(false); }); @@ -83,7 +83,7 @@ describe('stringMatchesSomePattern()', () => { expect(stringMatchesSomePattern('foobar', ['baz', 'nope'], true)).toEqual(false); }); - test('matches when `testString` constains a pattern but not vice-versa', () => { + test('matches when `testString` contains a pattern but not vice-versa', () => { expect(stringMatchesSomePattern('foobar', ['foo', 'nope'])).toEqual(true); expect(stringMatchesSomePattern('foobar', ['foobarbaz', 'nope'])).toEqual(false); }); diff --git a/packages/utils/test/syncpromise.test.ts b/packages/utils/test/syncpromise.test.ts index 53dff943fa48..b3074b3c1b32 100644 --- a/packages/utils/test/syncpromise.test.ts +++ b/packages/utils/test/syncpromise.test.ts @@ -145,7 +145,7 @@ describe('SyncPromise', () => { expect(foo).toEqual(2); }); - test('calling the callback not immediatly', () => { + test('calling the callback not immediately', () => { jest.useFakeTimers(); expect.assertions(4); @@ -226,7 +226,7 @@ describe('SyncPromise', () => { }); }); - test('reject immediatly and do not call then', async () => { + test('reject immediately and do not call then', async () => { expect.assertions(1); return new SyncPromise((_, reject) => { diff --git a/packages/utils/test/url.test.ts b/packages/utils/test/url.test.ts index d58f7cf205a8..c6926fb74968 100644 --- a/packages/utils/test/url.test.ts +++ b/packages/utils/test/url.test.ts @@ -24,8 +24,8 @@ describe('stripQueryStringAndFragment', () => { describe('getNumberOfUrlSegments', () => { test.each([ ['regular path', '/projects/123/views/234', 4], - ['single param paramaterized path', '/users/:id/details', 3], - ['multi param paramaterized path', '/stores/:storeId/products/:productId', 4], + ['single param parameterized path', '/users/:id/details', 3], + ['multi param parameterized path', '/stores/:storeId/products/:productId', 4], ['regex path', String(/\/api\/post[0-9]/), 2], ])('%s', (_: string, input, output) => { expect(getNumberOfUrlSegments(input)).toEqual(output); diff --git a/packages/vercel-edge/package.json b/packages/vercel-edge/package.json index b80c0c279668..bc36f5880949 100644 --- a/packages/vercel-edge/package.json +++ b/packages/vercel-edge/package.json @@ -1,7 +1,7 @@ { "name": "@sentry/vercel-edge", "version": "8.36.0", - "description": "Offical Sentry SDK for the Vercel Edge Runtime", + "description": "Official Sentry SDK for the Vercel Edge Runtime", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/vercel-edge", "author": "Sentry", diff --git a/tsconfig-templates/README.md b/tsconfig-templates/README.md index 8c007dcbb7c2..f1b29fb1b3e9 100644 --- a/tsconfig-templates/README.md +++ b/tsconfig-templates/README.md @@ -3,5 +3,5 @@ Every package should get its own copy of the three files in this directory and the one in `test/` (which should go in an analogous spot in the package). Package-specific options should go in `tsconfig.json` and test-specific options in `tsconfig.test.json`. The `types` file shouldn't need to be modified, and only exists because tsconfigs don't support -multiple inheritence. The same goes for the file in `test/`, which only exists because VSCode only knows to look for a +multiple inheritance. The same goes for the file in `test/`, which only exists because VSCode only knows to look for a file named (exactly) `tsconfig.json`. From c2bae3ed9cd4a79fc634b1b7f2baa1d2fad246ef Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 5 Nov 2024 09:12:00 +0100 Subject: [PATCH 26/31] meta: Remove slightly invasive VS Code workspace settings (#14170) Removes VS Code workspace settings that imo are more preference than adding anything useful. --- .vscode/settings.json | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4926554ffe4b..0f2399922cfc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,5 @@ { - "editor.formatOnType": true, - "editor.formatOnPaste": false, - "editor.formatOnSave": true, - "editor.rulers": [120], "editor.tabSize": 2, - "files.autoSave": "onWindowChange", "files.trimTrailingWhitespace": true, "files.insertFinalNewline": true, "search.exclude": { @@ -15,11 +10,6 @@ "**/yarn-error.log": true }, "typescript.tsdk": "./node_modules/typescript/lib", - "[json]": { - "editor.formatOnType": false, - "editor.formatOnPaste": false, - "editor.formatOnSave": false - }, "[markdown]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, @@ -35,12 +25,8 @@ } ], "deno.enablePaths": ["packages/deno/test"], - "editor.codeActionsOnSave": { - "source.organizeImports.biome": "explicit" - }, "editor.defaultFormatter": "biomejs.biome", "[typescript]": { "editor.defaultFormatter": "biomejs.biome" - }, - "cSpell.words": ["arrayify", "OTEL"] + } } From e1c49dcc06fc68deb23078304297de16d36f33f4 Mon Sep 17 00:00:00 2001 From: Andrei <168741329+andreiborza@users.noreply.github.com> Date: Tue, 5 Nov 2024 12:54:52 +0100 Subject: [PATCH 27/31] fix(core): Ensure errors thrown in async cron jobs bubble up (#14182) https://github.com/getsentry/sentry-javascript/pull/14182/commits/d045ba1b51dd8b889cba60bfdf154b907b725a0a adds tests that fail: https://github.com/getsentry/sentry-javascript/actions/runs/11682775381/job/32530893436?pr=14182#step:14:217 https://github.com/getsentry/sentry-javascript/pull/14182/commits/be36a2284923907a2a3d9323526b0196bf0fae8c adds the fix Closes: https://github.com/getsentry/sentry-javascript/issues/14163 --- .../nestjs-basic/src/app.controller.ts | 6 +-- .../nestjs-basic/src/app.service.ts | 15 ++++++- .../nestjs-basic/tests/cron-decorator.test.ts | 34 ++++++++++++-- packages/core/src/exports.ts | 3 +- packages/core/test/lib/base.test.ts | 45 +++++++++++++++++++ 5 files changed, 93 insertions(+), 10 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.controller.ts b/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.controller.ts index 77e25a72dad5..33a6b1957d99 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.controller.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.controller.ts @@ -77,9 +77,9 @@ export class AppController { return { result: await this.appService.testSpanDecoratorSync() }; } - @Get('kill-test-cron') - async killTestCron() { - this.appService.killTestCron(); + @Get('kill-test-cron/:job') + async killTestCron(@Param('job') job: string) { + this.appService.killTestCron(job); } @Get('flush') diff --git a/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.service.ts b/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.service.ts index 72aef6947a6c..067282dd1ee2 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.service.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-basic/src/app.service.ts @@ -80,8 +80,19 @@ export class AppService { console.log('Test cron!'); } - async killTestCron() { - this.schedulerRegistry.deleteCronJob('test-cron-job'); + /* + Actual cron schedule differs from schedule defined in config because Sentry + only supports minute granularity, but we don't want to wait (worst case) a + full minute for the tests to finish. + */ + @Cron('*/5 * * * * *', { name: 'test-cron-error' }) + @SentryCron('test-cron-error-slug', monitorConfig) + async testCronError() { + throw new Error('Test error from cron job'); + } + + async killTestCron(job: string) { + this.schedulerRegistry.deleteCronJob(job); } use() { diff --git a/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/cron-decorator.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/cron-decorator.test.ts index 2c93e7c6adaa..03ae6011d2b4 100644 --- a/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/cron-decorator.test.ts +++ b/dev-packages/e2e-tests/test-applications/nestjs-basic/tests/cron-decorator.test.ts @@ -1,13 +1,21 @@ import { expect, test } from '@playwright/test'; -import { waitForEnvelopeItem } from '@sentry-internal/test-utils'; +import { waitForEnvelopeItem, waitForError } from '@sentry-internal/test-utils'; test('Cron job triggers send of in_progress envelope', async ({ baseURL }) => { const inProgressEnvelopePromise = waitForEnvelopeItem('nestjs-basic', envelope => { - return envelope[0].type === 'check_in' && envelope[1]['status'] === 'in_progress'; + return ( + envelope[0].type === 'check_in' && + envelope[1]['monitor_slug'] === 'test-cron-slug' && + envelope[1]['status'] === 'in_progress' + ); }); const okEnvelopePromise = waitForEnvelopeItem('nestjs-basic', envelope => { - return envelope[0].type === 'check_in' && envelope[1]['status'] === 'ok'; + return ( + envelope[0].type === 'check_in' && + envelope[1]['monitor_slug'] === 'test-cron-slug' && + envelope[1]['status'] === 'ok' + ); }); const inProgressEnvelope = await inProgressEnvelopePromise; @@ -51,5 +59,23 @@ test('Cron job triggers send of in_progress envelope', async ({ baseURL }) => { ); // kill cron so tests don't get stuck - await fetch(`${baseURL}/kill-test-cron`); + await fetch(`${baseURL}/kill-test-cron/test-cron-job`); +}); + +test('Sends exceptions to Sentry on error in cron job', async ({ baseURL }) => { + const errorEventPromise = waitForError('nestjs-basic', event => { + return !event.type && event.exception?.values?.[0]?.value === 'Test error from cron job'; + }); + + const errorEvent = await errorEventPromise; + + expect(errorEvent.exception?.values).toHaveLength(1); + expect(errorEvent.exception?.values?.[0]?.value).toBe('Test error from cron job'); + expect(errorEvent.contexts?.trace).toEqual({ + trace_id: expect.any(String), + span_id: expect.any(String), + }); + + // kill cron so tests don't get stuck + await fetch(`${baseURL}/kill-test-cron/test-cron-error`); }); diff --git a/packages/core/src/exports.ts b/packages/core/src/exports.ts index 3ce83bcd5788..8235e855903d 100644 --- a/packages/core/src/exports.ts +++ b/packages/core/src/exports.ts @@ -189,8 +189,9 @@ export function withMonitor( () => { finishCheckIn('ok'); }, - () => { + e => { finishCheckIn('error'); + throw e; }, ); } else { diff --git a/packages/core/test/lib/base.test.ts b/packages/core/test/lib/base.test.ts index 026b2b3479bc..c89065ed218a 100644 --- a/packages/core/test/lib/base.test.ts +++ b/packages/core/test/lib/base.test.ts @@ -9,6 +9,7 @@ import { lastEventId, makeSession, setCurrentClient, + withMonitor, } from '../../src'; import * as integrationModule from '../../src/integration'; import { TestClient, getDefaultTestClientOptions } from '../mocks/client'; @@ -2090,4 +2091,48 @@ describe('BaseClient', () => { expect(callback).toBeCalledWith(errorEvent, { statusCode: 200 }); }); }); + + describe('withMonitor', () => { + test('handles successful synchronous operations', () => { + const result = 'foo'; + const callback = jest.fn().mockReturnValue(result); + + const returnedResult = withMonitor('test-monitor', callback); + + expect(returnedResult).toBe(result); + expect(callback).toHaveBeenCalledTimes(1); + }); + + test('handles synchronous errors', () => { + const error = new Error('Test error'); + const callback = jest.fn().mockImplementation(() => { + throw error; + }); + + expect(() => withMonitor('test-monitor', callback)).toThrowError(error); + }); + + test('handles successful asynchronous operations', async () => { + const result = 'foo'; + const callback = jest.fn().mockResolvedValue(result); + + const promise = withMonitor('test-monitor', callback); + await expect(promise).resolves.toEqual(result); + }); + + // This test is skipped because jest keeps retrying ad infinitum + // when encountering an unhandled rejections. + // We could set "NODE_OPTIONS='--unhandled-rejections=warn' but it + // would affect the entire test suite. + // Maybe this can be re-enabled when switching to vitest. + // + // eslint-disable-next-line @sentry-internal/sdk/no-skipped-tests + test.skip('handles asynchronous errors', async () => { + const error = new Error('Test error'); + const callback = jest.fn().mockRejectedValue(error); + + const promise = await withMonitor('test-monitor', callback); + await expect(promise).rejects.toThrowError(error); + }); + }); }); From e45566d5ea5208f2cc8f7050041d235c6bedc605 Mon Sep 17 00:00:00 2001 From: Daniel Griesser Date: Tue, 5 Nov 2024 13:45:08 +0100 Subject: [PATCH 28/31] ref: Add external contributor to CHANGELOG.md (#14178) This PR adds the external contributor to the CHANGELOG.md file, so that they are credited for their contribution. See #14144 Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com> --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31db2ef30b12..130085cf3630 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ - "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott +Work in this release was contributed by @rexxars. Thank you for your contribution! + - **feat(nuxt): Add `piniaIntegration` ([#14138](https://github.com/getsentry/sentry-javascript/pull/14138))** The Nuxt SDK now allows you to track Pinia state for captured errors. To enable the Pinia plugin, add the `piniaIntegration` to your client config: From ff18dfd522b06c8c97b5a084a84661e42de33ed5 Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Tue, 5 Nov 2024 13:56:16 +0100 Subject: [PATCH 29/31] fix(nextjs): Resolve path for dynamic webpack import (#13751) --- packages/nextjs/src/config/webpack.ts | 3 ++- packages/utils/src/node.ts | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/src/config/webpack.ts b/packages/nextjs/src/config/webpack.ts index 79bd230a3ee7..6b96b96ecec1 100644 --- a/packages/nextjs/src/config/webpack.ts +++ b/packages/nextjs/src/config/webpack.ts @@ -332,7 +332,8 @@ export function constructWebpackConfigFunction( // Symbolication for dev-mode errors is done elsewhere. if (!isDev) { // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { sentryWebpackPlugin } = loadModule('@sentry/webpack-plugin') as any; + const { sentryWebpackPlugin } = loadModule<{ sentryWebpackPlugin: any }>('@sentry/webpack-plugin') ?? {}; + if (sentryWebpackPlugin) { if (!userSentryOptions.sourcemaps?.disable) { // `hidden-source-map` produces the same sourcemaps as `source-map`, but doesn't include the `sourceMappingURL` diff --git a/packages/utils/src/node.ts b/packages/utils/src/node.ts index 39b4258eccc7..8640a5a95801 100644 --- a/packages/utils/src/node.ts +++ b/packages/utils/src/node.ts @@ -52,11 +52,13 @@ export function loadModule(moduleName: string): T | undefined { // no-empty } - try { - const { cwd } = dynamicRequire(module, 'process'); - mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) as T; - } catch (e) { - // no-empty + if (!mod) { + try { + const { cwd } = dynamicRequire(module, 'process'); + mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) as T; + } catch (e) { + // no-empty + } } return mod; From ac57e5340a5070f6f6348553988b63fa5a5b4204 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 5 Nov 2024 14:12:00 +0100 Subject: [PATCH 30/31] fix(browser): Avoid recording long task spans starting before their parent span (#14183) - check for the start time stamp and drops long task spans starting before a _navigation_ spans started. - refactor the start and end logic a bit to compensate for bundle size increase (see comment) - add a regression test that previously would fail --- .size-limit.js | 4 +-- .../long-tasks-before-navigation/init.js | 19 +++++++++++++ .../long-tasks-before-navigation/subject.js | 17 ++++++++++++ .../template.html | 13 +++++++++ .../long-tasks-before-navigation/test.ts | 27 +++++++++++++++++++ .../src/metrics/browserMetrics.ts | 20 +++++++++----- packages/browser/package.json | 10 +++---- 7 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/init.js create mode 100644 dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/subject.js create mode 100644 dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html create mode 100644 dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts diff --git a/.size-limit.js b/.size-limit.js index 0030dc3afe7f..8b506b8f683b 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -40,7 +40,7 @@ module.exports = [ path: 'packages/browser/build/npm/esm/index.js', import: createImport('init', 'browserTracingIntegration'), gzip: true, - limit: '36 KB', + limit: '36.5 KB', }, { name: '@sentry/browser (incl. Tracing, Replay)', @@ -124,7 +124,7 @@ module.exports = [ import: createImport('init', 'ErrorBoundary', 'reactRouterV6BrowserTracingIntegration'), ignore: ['react/jsx-runtime'], gzip: true, - limit: '39.05 KB', + limit: '39.5 KB', }, // Vue SDK (ESM) { diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/init.js new file mode 100644 index 000000000000..1f396416d855 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/init.js @@ -0,0 +1,19 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [ + Sentry.browserTracingIntegration({ + idleTimeout: 9000, + enableLongAnimationFrame: false, + instrumentPageLoad: false, + instrumentNavigation: true, + enableInp: false, + enableLongTask: true, + }), + ], + tracesSampleRate: 1, + debug: true, +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/subject.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/subject.js new file mode 100644 index 000000000000..2c477161b9f4 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/subject.js @@ -0,0 +1,17 @@ +const longTaskButton = document.getElementById('myButton'); + +longTaskButton?.addEventListener('click', () => { + const startTime = Date.now(); + + function getElapsed() { + const time = Date.now(); + return time - startTime; + } + + while (getElapsed() < 500) { + // + } + + // trigger a navigation in the same event loop tick + window.history.pushState({}, '', '/#myHeading'); +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html new file mode 100644 index 000000000000..1c6430a388b2 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html @@ -0,0 +1,13 @@ + + + + + + +

Rendered Before Long Task
+ + + +

Heading

+ + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts new file mode 100644 index 000000000000..fe2efb6b3565 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts @@ -0,0 +1,27 @@ +import { expect } from '@playwright/test'; +import type { Event } from '@sentry/types'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { getFirstSentryEnvelopeRequest, shouldSkipTracingTest } from '../../../../utils/helpers'; + +sentryTest( + "doesn't capture long task spans starting before a navigation in the navigation transaction", + async ({ browserName, getLocalTestPath, page }) => { + // Long tasks only work on chrome + if (shouldSkipTracingTest() || browserName !== 'chromium') { + sentryTest.skip(); + } + const url = await getLocalTestPath({ testDir: __dirname }); + + await page.goto(url); + + await page.locator('#myButton').click(); + + const navigationTransactionEvent = await getFirstSentryEnvelopeRequest(page, url); + + expect(navigationTransactionEvent.contexts?.trace?.op).toBe('navigation'); + + const longTaskSpans = navigationTransactionEvent?.spans?.filter(span => span.op === 'ui.long-task'); + expect(longTaskSpans).toHaveLength(0); + }, +); diff --git a/packages/browser-utils/src/metrics/browserMetrics.ts b/packages/browser-utils/src/metrics/browserMetrics.ts index 59a58290c502..670b1ce4ae25 100644 --- a/packages/browser-utils/src/metrics/browserMetrics.ts +++ b/packages/browser-utils/src/metrics/browserMetrics.ts @@ -105,24 +105,32 @@ export function startTrackingWebVitals({ recordClsStandaloneSpans }: StartTracki */ export function startTrackingLongTasks(): void { addPerformanceInstrumentationHandler('longtask', ({ entries }) => { - if (!getActiveSpan()) { + const parent = getActiveSpan(); + if (!parent) { return; } + + const { op: parentOp, start_timestamp: parentStartTimestamp } = spanToJSON(parent); + for (const entry of entries) { const startTime = msToSec((browserPerformanceTimeOrigin as number) + entry.startTime); const duration = msToSec(entry.duration); - const span = startInactiveSpan({ + if (parentOp === 'navigation' && parentStartTimestamp && startTime < parentStartTimestamp) { + // Skip adding a span if the long task started before the navigation started. + // `startAndEndSpan` will otherwise adjust the parent's start time to the span's start + // time, potentially skewing the duration of the actual navigation as reported via our + // routing instrumentations + continue; + } + + startAndEndSpan(parent, startTime, startTime + duration, { name: 'Main UI thread blocked', op: 'ui.long-task', - startTime, attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics', }, }); - if (span) { - span.end(startTime + duration); - } } }); } diff --git a/packages/browser/package.json b/packages/browser/package.json index 532ebe06c4ea..f72074b4c5ba 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -9,9 +9,7 @@ "engines": { "node": ">=14.18" }, - "files": [ - "/build/npm" - ], + "files": ["/build/npm"], "main": "build/npm/cjs/index.js", "module": "build/npm/esm/index.js", "types": "build/npm/types/index.d.ts", @@ -30,9 +28,7 @@ }, "typesVersions": { "<4.9": { - "build/npm/types/index.d.ts": [ - "build/npm/types-ts3.8/index.d.ts" - ] + "build/npm/types/index.d.ts": ["build/npm/types-ts3.8/index.d.ts"] } }, "publishConfig": { @@ -53,7 +49,7 @@ }, "scripts": { "build": "run-p build:transpile build:bundle build:types", - "build:dev": "yarn build", + "build:dev": "run-p build:transpile build:types", "build:bundle": "rollup -c rollup.bundle.config.mjs", "build:transpile": "rollup -c rollup.npm.config.mjs", "build:types": "run-s build:types:core build:types:downlevel", From ad4271118479a9ddb624ccf6eea02d472e2070e3 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 5 Nov 2024 14:22:16 +0100 Subject: [PATCH 31/31] meta: Update Changelog for 8.37.0 --- CHANGELOG.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 130085cf3630..452113160a0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,9 @@ - "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott -Work in this release was contributed by @rexxars. Thank you for your contribution! +## 8.37.0 + +### Important CHanges - **feat(nuxt): Add `piniaIntegration` ([#14138](https://github.com/getsentry/sentry-javascript/pull/14138))** @@ -29,6 +31,35 @@ Sentry.init({ }); ``` +- **feat: Deprecate metrics API ([#14157](https://github.com/getsentry/sentry-javascript/pull/14157))** + +The Sentry Metrics beta has ended in favour of revisiting metrics in another form at a later date. + +This new approach will include different APIs, making the current metrics API unnecessary. This release +deprecates the metrics API with the plan to remove in the next SDK major version. If you currently use the +metrics API in your code, you can safely continue to do so but sent data will no longer be processed by Sentry. + +[Learn more](https://sentry.zendesk.com/hc/en-us/articles/26369339769883-Metrics-Beta-Ended-on-October-7th) about the end of the Metrics beta. + +### Other Changes + +- feat(browser): Add `http.response_delivery_type` attribute to resource spans ([#14056](https://github.com/getsentry/sentry-javascript/pull/14056)) +- feat(browser): Add `skipBrowserExtensionCheck` escape hatch option ([#14147](https://github.com/getsentry/sentry-javascript/pull/14147)) +- feat(deps): Bump @opentelemetry/instrumentation from 0.53.0 to 0.54.0 ([#14174](https://github.com/getsentry/sentry-javascript/pull/14174)) +- feat(deps): Bump @opentelemetry/instrumentation-fastify from 0.40.0 to 0.41.0 ([#14175](https://github.com/getsentry/sentry-javascript/pull/14175)) +- feat(deps): Bump @opentelemetry/instrumentation-graphql from 0.43.0 to 0.44.0 ([#14173](https://github.com/getsentry/sentry-javascript/pull/14173)) +- feat(deps): Bump @opentelemetry/instrumentation-mongodb from 0.47.0 to 0.48.0 ([#14171](https://github.com/getsentry/sentry-javascript/pull/14171)) +- feat(deps): Bump @opentelemetry/propagator-aws-xray from 1.25.1 to 1.26.0 ([#14172](https://github.com/getsentry/sentry-javascript/pull/14172)) +- feat(nuxt): Add `asyncFunctionReExports` to define re-exported server functions ([#14104](https://github.com/getsentry/sentry-javascript/pull/14104)) +- feat(nuxt): Add `piniaIntegration` ([#14138](https://github.com/getsentry/sentry-javascript/pull/14138)) +- fix(browser): Avoid recording long task spans starting before their parent span ([#14183](https://github.com/getsentry/sentry-javascript/pull/14183)) +- fix(core): Ensure errors thrown in async cron jobs bubble up ([#14182](https://github.com/getsentry/sentry-javascript/pull/14182)) +- fix(core): Silently fail `maybeInstrument` ([#14140](https://github.com/getsentry/sentry-javascript/pull/14140)) +- fix(nextjs): Resolve path for dynamic webpack import ([#13751](https://github.com/getsentry/sentry-javascript/pull/13751)) +- fix(node): Make sure `modulesIntegration` does not crash esm apps ([#14169](https://github.com/getsentry/sentry-javascript/pull/14169)) + +Work in this release was contributed by @rexxars. Thank you for your contribution! + ## 8.36.0 ### Important Changes