From eb4b44721a8b791407cd7785138bb6203419f558 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Dr=C3=A4xler?= Date: Thu, 4 Apr 2024 22:51:42 +0200 Subject: [PATCH 01/96] Update sharp to 0.33 to fix issue with Alpine Linux It was impossible for me to use the Astro image service in an Alpine Linux docker container. Even though I would install sharp `0.33.3` in my app, pnpm would download version `0.32.6`, which doesn't work in Alpine Linux container. Currently, I have to override the downloaded version in my package.json. For more details see: - https://github.com/lovell/sharp/issues/4054 - https://discord.com/channels/830184174198718474/1224861729792458803/1224861729792458803 This PR updates the version of the `sharp` dependency to `^0.33` and thus makes Astro compatible with Alpine Linux. --- packages/astro/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index 3d8910d1c397..d9ccc419e717 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -178,7 +178,7 @@ "zod-to-json-schema": "^3.22.4" }, "optionalDependencies": { - "sharp": "^0.32.6" + "sharp": "^0.33" }, "devDependencies": { "@astrojs/check": "^0.5.8", From c09b91eb2b9fda718a32a054e8252c529faf1b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Dr=C3=A4xler?= Date: Thu, 4 Apr 2024 18:37:51 -0300 Subject: [PATCH 02/96] update lock file --- pnpm-lock.yaml | 231 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 229 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f253a1b073d..6e28b9290e12 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -691,8 +691,8 @@ importers: version: 3.22.5(zod@3.22.4) optionalDependencies: sharp: - specifier: ^0.32.6 - version: 0.32.6 + specifier: ^0.33 + version: 0.33.3 devDependencies: '@astrojs/check': specifier: ^0.5.8 @@ -6842,6 +6842,14 @@ packages: /@emmetio/scanner@1.0.4: resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + /@emnapi/runtime@1.1.1: + resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + /@esbuild/aix-ppc64@0.19.12: resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -7275,6 +7283,194 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true + /@img/sharp-darwin-arm64@0.33.3: + resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.3: + resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.2: + resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.2: + resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.2: + resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.2: + resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.2: + resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.2: + resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.2: + resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.2: + resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.3: + resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.3: + resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.3: + resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.3: + resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.3: + resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.3: + resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.3: + resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.1.1 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.3: + resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.3: + resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -15333,6 +15529,37 @@ packages: tunnel-agent: 0.6.0 dev: false + /sharp@0.33.3: + resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} + engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.0 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.3 + '@img/sharp-darwin-x64': 0.33.3 + '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-linux-arm': 0.33.3 + '@img/sharp-linux-arm64': 0.33.3 + '@img/sharp-linux-s390x': 0.33.3 + '@img/sharp-linux-x64': 0.33.3 + '@img/sharp-linuxmusl-arm64': 0.33.3 + '@img/sharp-linuxmusl-x64': 0.33.3 + '@img/sharp-wasm32': 0.33.3 + '@img/sharp-win32-ia32': 0.33.3 + '@img/sharp-win32-x64': 0.33.3 + dev: false + optional: true + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} From f1a9132fad031c3ba14df2399a80f1e360b33754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Dr=C3=A4xler?= Date: Thu, 4 Apr 2024 18:37:55 -0300 Subject: [PATCH 03/96] add changelog --- .changeset/famous-mugs-grab.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/famous-mugs-grab.md diff --git a/.changeset/famous-mugs-grab.md b/.changeset/famous-mugs-grab.md new file mode 100644 index 000000000000..02d97d16fd5e --- /dev/null +++ b/.changeset/famous-mugs-grab.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Update sharp to 0.33 to fix issue with Alpine Linux From 1a6a6709a031db86469f620c4b05836efb80ed12 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:05:59 +0200 Subject: [PATCH 04/96] Update packages/astro/package.json --- packages/astro/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index 116270bbb45c..bba8211d7512 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -179,7 +179,7 @@ "zod-to-json-schema": "^3.22.4" }, "optionalDependencies": { - "sharp": "^0.33" + "sharp": "^0.33.3" }, "devDependencies": { "@astrojs/check": "^0.5.8", From 16a94332d03a889db7e0682cd6776e25125be980 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:07:23 +0200 Subject: [PATCH 05/96] Update pnpm-lock.yaml --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 337e93245c3f..747abd17927c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -694,7 +694,7 @@ importers: version: 3.22.5(zod@3.22.4) optionalDependencies: sharp: - specifier: ^0.33 + specifier: ^0.33.3 version: 0.33.3 devDependencies: '@astrojs/check': From 587d0c2ab8e6a72aa3a8adb66ca088e1b8c44daa Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Fri, 5 Apr 2024 11:54:12 +0100 Subject: [PATCH 06/96] ci: update check-merge.yml action (#10690) --- .github/workflows/check-merge.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-merge.yml b/.github/workflows/check-merge.yml index 7780f2aa9637..a40a3b8714bd 100644 --- a/.github/workflows/check-merge.yml +++ b/.github/workflows/check-merge.yml @@ -40,7 +40,7 @@ jobs: - name: Get changed files in the .changeset folder id: changed-files - uses: tj-actions/changed-files@v42 + uses: tj-actions/changed-files@v44 if: steps.blocked.outputs.result != 'true' with: files: | @@ -49,12 +49,14 @@ jobs: - name: Check if any changesets contain minor or major changes id: check if: steps.blocked.outputs.result != 'true' + env: + ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} run: | echo "Checking for changesets marked as minor or major" echo "found=false" >> $GITHUB_OUTPUT regex="[\"']astro[\"']: (minor|major)" - for file in ${{ steps.changed-files.outputs.all_changed_files }}; do + for file in ${ALL_CHANGED_FILES}; do if [[ $(cat $file) =~ $regex ]]; then version="${BASH_REMATCH[1]}" echo "version=$version" >> $GITHUB_OUTPUT From a2428eb9e9a891877ca789233642ef1102fd5171 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:24:00 +0100 Subject: [PATCH 07/96] test(@astrojs/node) listen for server setup errors in test-utils (#10692) --- packages/integrations/node/test/test-utils.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/integrations/node/test/test-utils.js b/packages/integrations/node/test/test-utils.js index f27c3485b9aa..10faba5cf9b7 100644 --- a/packages/integrations/node/test/test-utils.js +++ b/packages/integrations/node/test/test-utils.js @@ -66,9 +66,16 @@ export function buffersToString(buffers) { } export function waitServerListen(server) { - return new Promise((resolve) => { - server.on('listening', () => { + return new Promise((resolve, reject) => { + function onListen() { + server.off('error', onError); resolve(); - }); + } + function onError(error) { + server.off('listening', onListen); + reject(error); + } + server.once('listening', onListen); + server.once('error', onError); }); } From 4595e2361c2160a9bcd923840d0eaad040f6c98b Mon Sep 17 00:00:00 2001 From: apetta Date: Fri, 5 Apr 2024 14:17:35 +0100 Subject: [PATCH 08/96] Add disableremoteplayback attribute to VideoHTMLAttributes interface (#10693) * Add disableremoteplayback attribute to VideoHTMLAttributes interface * Move disableremoteplayback from VideoHTMLAttributes to MediaHTMLAttributes * Create olive-camels-greet.md * Update packages/astro/astro-jsx.d.ts --------- Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com> --- .changeset/olive-camels-greet.md | 5 +++++ packages/astro/astro-jsx.d.ts | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 .changeset/olive-camels-greet.md diff --git a/.changeset/olive-camels-greet.md b/.changeset/olive-camels-greet.md new file mode 100644 index 000000000000..6fa4a59c289b --- /dev/null +++ b/.changeset/olive-camels-greet.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Adds the `disableremoteplayback` attribute to MediaHTMLAttributes interface diff --git a/packages/astro/astro-jsx.d.ts b/packages/astro/astro-jsx.d.ts index 869e64d5c919..08a6c7fba92d 100644 --- a/packages/astro/astro-jsx.d.ts +++ b/packages/astro/astro-jsx.d.ts @@ -873,6 +873,8 @@ declare namespace astroHTML.JSX { playsinline?: boolean | string | undefined | null; preload?: string | undefined | null; src?: string | undefined | null; + // https://www.w3.org/TR/remote-playback/#the-disableremoteplayback-attribute + disableRemotePlayback?: boolean | string | undefined | null; } interface MetaHTMLAttributes extends HTMLAttributes { From 2ee640a03d763bc4754c104138583521ae7bcec9 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:30:59 +0100 Subject: [PATCH 09/96] test(@astrojs/node) wait for server listening in trailing-slash tests (#10694) * test(@astrojs/node) wait for server listening in trailing-slash tests * fix missing waitServerListen * fix import statement --------- Co-authored-by: Emanuele Stoppa --- packages/integrations/node/test/prerender.test.js | 1 + packages/integrations/node/test/trailing-slash.test.js | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/integrations/node/test/prerender.test.js b/packages/integrations/node/test/prerender.test.js index bf34fc99ddfd..29080981aba8 100644 --- a/packages/integrations/node/test/prerender.test.js +++ b/packages/integrations/node/test/prerender.test.js @@ -329,6 +329,7 @@ describe('Hybrid rendering', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { diff --git a/packages/integrations/node/test/trailing-slash.test.js b/packages/integrations/node/test/trailing-slash.test.js index 79d5d247a08e..ad91a275949e 100644 --- a/packages/integrations/node/test/trailing-slash.test.js +++ b/packages/integrations/node/test/trailing-slash.test.js @@ -2,7 +2,7 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; import * as cheerio from 'cheerio'; import nodejs from '../dist/index.js'; -import { loadFixture } from './test-utils.js'; +import { loadFixture, waitServerListen } from './test-utils.js'; /** * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture @@ -36,6 +36,7 @@ describe('Trailing slash', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -101,6 +102,7 @@ describe('Trailing slash', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -169,6 +171,7 @@ describe('Trailing slash', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -227,6 +230,7 @@ describe('Trailing slash', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -288,6 +292,7 @@ describe('Trailing slash', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -364,6 +369,7 @@ describe('Trailing slash', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { From 087c523277156530779463c38d6cccabffd9755d Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:07:12 +0100 Subject: [PATCH 10/96] chore: add `test:citgm` command that would run tests without caching and `build:ci:no-cache` to skip caching for build as well (#10696) * chore: add test:citgm command that would run tests without caching * adding build ci with no cache --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index b68cdf1b44b7..5885481522e7 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "release": "pnpm run build && changeset publish", "build": "turbo run build --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "build:ci": "turbo run build:ci --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", + "build:ci:no-cache": "pnpm run build:ci -- --force", "build:examples": "turbo run build --filter=\"@example/*\"", "dev": "turbo run dev --concurrency=40 --parallel --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "format": "pnpm run format:code && pnpm run format:imports", @@ -20,6 +21,7 @@ "format:imports": "biome check --apply .", "format:imports:ci": "biome ci .", "test": "turbo run test --concurrency=1 --filter=astro --filter=create-astro --filter=\"@astrojs/*\"", + "test:citgm": "pnpm run test -- --force", "test:match": "cd packages/astro && pnpm run test:match", "test:unit": "cd packages/astro && pnpm run test:unit", "test:unit:match": "cd packages/astro && pnpm run test:unit:match", From ef37d889f837e5e5dafdc443c92931d5ef4d3254 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Fri, 5 Apr 2024 18:05:02 +0100 Subject: [PATCH 11/96] chore: fix build:ci:no-cache test:citgm (#10698) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5885481522e7..9aafe99c04be 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "release": "pnpm run build && changeset publish", "build": "turbo run build --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "build:ci": "turbo run build:ci --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", - "build:ci:no-cache": "pnpm run build:ci -- --force", + "build:ci:no-cache": "pnpm build:ci --force", "build:examples": "turbo run build --filter=\"@example/*\"", "dev": "turbo run dev --concurrency=40 --parallel --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "format": "pnpm run format:code && pnpm run format:imports", @@ -21,7 +21,7 @@ "format:imports": "biome check --apply .", "format:imports:ci": "biome ci .", "test": "turbo run test --concurrency=1 --filter=astro --filter=create-astro --filter=\"@astrojs/*\"", - "test:citgm": "pnpm run test -- --force", + "test:citgm": "pnpm test --force", "test:match": "cd packages/astro && pnpm run test:match", "test:unit": "cd packages/astro && pnpm run test:unit", "test:unit:match": "cd packages/astro && pnpm run test:unit:match", From 3969364a3a1b3981fe1f53ce33038abd76320841 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Fri, 5 Apr 2024 17:39:24 -0500 Subject: [PATCH 12/96] Improve dev toolbar notification contrast on hover (#10657) * fix(#10399, PLT-1786): improve notification contrast on hover * chore: add changeset --- .changeset/loud-wasps-pay.md | 5 +++++ .../astro/src/runtime/client/dev-toolbar/entrypoint.ts | 6 +++--- packages/astro/src/runtime/client/dev-toolbar/toolbar.ts | 8 +++++++- 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/loud-wasps-pay.md diff --git a/.changeset/loud-wasps-pay.md b/.changeset/loud-wasps-pay.md new file mode 100644 index 000000000000..60411aa01323 --- /dev/null +++ b/.changeset/loud-wasps-pay.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Improves the color contrast for notification badges on dev toolbar apps diff --git a/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts b/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts index f115decf0676..bb69254385f0 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts @@ -65,10 +65,10 @@ document.addEventListener('DOMContentLoaded', async () => { const notificationLevels = ['error', 'warning', 'info'] as const; const notificationSVGs: Record<(typeof notificationLevels)[number], string> = { error: - '', + '', warning: - '', - info: '', + '', + info: '', } as const; const prepareApp = (appDefinition: DevToolbarAppDefinition, builtIn: boolean): DevToolbarApp => { diff --git a/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts b/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts index 33142b8f61cd..cc14d7c53566 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts @@ -189,8 +189,14 @@ export class AstroDevToolbar extends HTMLElement { } } + #dev-bar #bar-container .item:hover .notification rect, #dev-bar #bar-container .item:hover .notification path { + stroke: #38393D; + --fill: var(--fill-hover); + } + #dev-bar #bar-container .item.active .notification rect, #dev-bar #bar-container .item.active .notification path { - stroke: rgba(71, 78, 94, 1); + stroke: #454C5C; + --fill: var(--fill-hover); } #dev-bar .item .icon { From 16f0822145c7d756870221b2288c2553f99976f9 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Sat, 6 Apr 2024 20:30:02 +0100 Subject: [PATCH 13/96] fix test:citgm --force flag not passed correctly (#10706) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9aafe99c04be..1f33076d5319 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "format:imports": "biome check --apply .", "format:imports:ci": "biome ci .", "test": "turbo run test --concurrency=1 --filter=astro --filter=create-astro --filter=\"@astrojs/*\"", - "test:citgm": "pnpm test --force", + "test:citgm": "pnpm run test --force", "test:match": "cd packages/astro && pnpm run test:match", "test:unit": "cd packages/astro && pnpm run test:unit", "test:unit:match": "cd packages/astro && pnpm run test:unit:match", From 436aceedb8ae809c49bae245f9bf9db21573a417 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 8 Apr 2024 13:33:09 +0800 Subject: [PATCH 14/96] Skip prerender chunk in static output (#10695) --- .changeset/plenty-bugs-hunt.md | 5 +++++ packages/astro/src/core/build/plugins/plugin-prerender.ts | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .changeset/plenty-bugs-hunt.md diff --git a/.changeset/plenty-bugs-hunt.md b/.changeset/plenty-bugs-hunt.md new file mode 100644 index 000000000000..179310ea97b0 --- /dev/null +++ b/.changeset/plenty-bugs-hunt.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Skips prerender chunk if building with static output diff --git a/packages/astro/src/core/build/plugins/plugin-prerender.ts b/packages/astro/src/core/build/plugins/plugin-prerender.ts index ce9f925ee339..171d998b7b9b 100644 --- a/packages/astro/src/core/build/plugins/plugin-prerender.ts +++ b/packages/astro/src/core/build/plugins/plugin-prerender.ts @@ -68,7 +68,6 @@ function vitePluginPrerender(opts: StaticBuildOptions, internals: BuildInternals } } - opts.allPages; pageInfo.hasSharedModules = hasSharedModules; pageInfo.route.prerender = true; return 'prerender'; @@ -87,6 +86,11 @@ export function pluginPrerender( opts: StaticBuildOptions, internals: BuildInternals ): AstroBuildPlugin { + // Static output can skip prerender completely because we're already rendering all pages + if (opts.settings.config.output === 'static') { + return { targets: ['server'] }; + } + return { targets: ['server'], hooks: { From 6cb3eef2c75dffdc30285384944da81abd5b54e9 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 8 Apr 2024 13:35:34 +0800 Subject: [PATCH 15/96] Remove unused config in Vue JSX integration (#10687) --- .changeset/few-forks-taste.md | 5 +++++ packages/integrations/vue/package.json | 1 - packages/integrations/vue/src/index.ts | 18 ------------------ pnpm-lock.yaml | 3 --- 4 files changed, 5 insertions(+), 22 deletions(-) create mode 100644 .changeset/few-forks-taste.md diff --git a/.changeset/few-forks-taste.md b/.changeset/few-forks-taste.md new file mode 100644 index 000000000000..fd996361fa78 --- /dev/null +++ b/.changeset/few-forks-taste.md @@ -0,0 +1,5 @@ +--- +"@astrojs/vue": patch +--- + +Removes unused `jsxTransformOptions` and `jsxImportSource` options from the renderer config diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json index 341dd8ef0dc4..4cacb25332e5 100644 --- a/packages/integrations/vue/package.json +++ b/packages/integrations/vue/package.json @@ -42,7 +42,6 @@ "dependencies": { "@vitejs/plugin-vue": "^5.0.4", "@vitejs/plugin-vue-jsx": "^3.1.0", - "@vue/babel-plugin-jsx": "^1.1.5", "@vue/compiler-sfc": "^3.3.8" }, "devDependencies": { diff --git a/packages/integrations/vue/src/index.ts b/packages/integrations/vue/src/index.ts index 6f451c42451d..f2efc102bc7b 100644 --- a/packages/integrations/vue/src/index.ts +++ b/packages/integrations/vue/src/index.ts @@ -19,21 +19,6 @@ function getRenderer(): AstroRenderer { }; } -function getJsxRenderer(): AstroRenderer { - return { - name: '@astrojs/vue (jsx)', - clientEntrypoint: '@astrojs/vue/client.js', - serverEntrypoint: '@astrojs/vue/server.js', - jsxImportSource: 'vue', - jsxTransformOptions: async () => { - const jsxPlugin = (await import('@vue/babel-plugin-jsx')).default; - return { - plugins: [jsxPlugin], - }; - }, - }; -} - function virtualAppEntrypoint(options?: Options): Plugin { const virtualModuleId = 'virtual:@astrojs/vue/app'; const resolvedVirtualModuleId = '\0' + virtualModuleId; @@ -135,9 +120,6 @@ export default function (options?: Options): AstroIntegration { hooks: { 'astro:config:setup': async ({ addRenderer, updateConfig }) => { addRenderer(getRenderer()); - if (options?.jsx) { - addRenderer(getJsxRenderer()); - } updateConfig({ vite: await getViteConfiguration(options) }); }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e28b9290e12..4bda3a095ddc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5199,9 +5199,6 @@ importers: '@vitejs/plugin-vue-jsx': specifier: ^3.1.0 version: 3.1.0(vite@5.2.7)(vue@3.4.21) - '@vue/babel-plugin-jsx': - specifier: ^1.1.5 - version: 1.2.2(@babel/core@7.24.3) '@vue/compiler-sfc': specifier: ^3.3.8 version: 3.4.21 From 85ea3337c2b3ff6a197543aa032ef897474951d1 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 8 Apr 2024 13:35:41 +0800 Subject: [PATCH 16/96] Refactor MDX transformJSX handling (#10688) --- .changeset/four-pants-juggle.md | 5 + packages/astro/src/@types/astro.ts | 4 +- packages/astro/src/core/create-vite.ts | 2 +- packages/astro/src/jsx/renderer.ts | 18 +- packages/astro/src/jsx/transform-options.ts | 14 ++ packages/astro/src/vite-plugin-mdx/README.md | 4 +- packages/astro/src/vite-plugin-mdx/index.ts | 97 +-------- packages/astro/src/vite-plugin-mdx/tag.ts | 200 ++++++++---------- .../src/vite-plugin-mdx/transform-jsx.ts | 69 ++++++ packages/astro/test/units/render/jsx.test.js | 1 + 10 files changed, 198 insertions(+), 216 deletions(-) create mode 100644 .changeset/four-pants-juggle.md create mode 100644 packages/astro/src/jsx/transform-options.ts create mode 100644 packages/astro/src/vite-plugin-mdx/transform-jsx.ts diff --git a/.changeset/four-pants-juggle.md b/.changeset/four-pants-juggle.md new file mode 100644 index 000000000000..e10cb5019395 --- /dev/null +++ b/.changeset/four-pants-juggle.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Marks renderer `jsxImportSource` and `jsxTransformOptions` options as deprecated as they are no longer used since Astro 3.0 diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 010815695b20..e39689a25b75 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -2577,9 +2577,9 @@ export interface AstroRenderer { clientEntrypoint?: string; /** Import entrypoint for the server/build/ssr renderer. */ serverEntrypoint: string; - /** JSX identifier (e.g. 'react' or 'solid-js') */ + /** @deprecated Vite plugins should transform the JSX instead */ jsxImportSource?: string; - /** Babel transform options */ + /** @deprecated Vite plugins should transform the JSX instead */ jsxTransformOptions?: JSXTransformFn; } diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts index 56092bd323ec..cc32fb6f165d 100644 --- a/packages/astro/src/core/create-vite.ts +++ b/packages/astro/src/core/create-vite.ts @@ -137,7 +137,7 @@ export async function createVite( envVitePlugin({ settings }), markdownVitePlugin({ settings, logger }), htmlVitePlugin(), - mdxVitePlugin({ settings, logger }), + mdxVitePlugin(), astroPostprocessVitePlugin(), astroIntegrationsContainerPlugin({ settings, logger }), astroScriptsPageSSRPlugin({ settings }), diff --git a/packages/astro/src/jsx/renderer.ts b/packages/astro/src/jsx/renderer.ts index 39d7f5adb71b..413257faab97 100644 --- a/packages/astro/src/jsx/renderer.ts +++ b/packages/astro/src/jsx/renderer.ts @@ -1,19 +1,11 @@ -const renderer = { +import type { AstroRenderer } from '../@types/astro.js'; +import { jsxTransformOptions } from './transform-options.js'; + +const renderer: AstroRenderer = { name: 'astro:jsx', serverEntrypoint: 'astro/jsx/server.js', jsxImportSource: 'astro', - jsxTransformOptions: async () => { - // @ts-expect-error types not found - const plugin = await import('@babel/plugin-transform-react-jsx'); - const jsx = plugin.default?.default ?? plugin.default; - const { default: astroJSX } = await import('./babel.js'); - return { - plugins: [ - astroJSX(), - jsx({}, { throwIfNamespace: false, runtime: 'automatic', importSource: 'astro' }), - ], - }; - }, + jsxTransformOptions, }; export default renderer; diff --git a/packages/astro/src/jsx/transform-options.ts b/packages/astro/src/jsx/transform-options.ts new file mode 100644 index 000000000000..4b51d85b8b04 --- /dev/null +++ b/packages/astro/src/jsx/transform-options.ts @@ -0,0 +1,14 @@ +import type { JSXTransformConfig } from '../@types/astro.js'; + +export async function jsxTransformOptions(): Promise { + // @ts-expect-error types not found + const plugin = await import('@babel/plugin-transform-react-jsx'); + const jsx = plugin.default?.default ?? plugin.default; + const { default: astroJSX } = await import('./babel.js'); + return { + plugins: [ + astroJSX(), + jsx({}, { throwIfNamespace: false, runtime: 'automatic', importSource: 'astro' }), + ], + }; +} diff --git a/packages/astro/src/vite-plugin-mdx/README.md b/packages/astro/src/vite-plugin-mdx/README.md index 554651869496..fc962ad4ee3d 100644 --- a/packages/astro/src/vite-plugin-mdx/README.md +++ b/packages/astro/src/vite-plugin-mdx/README.md @@ -1,3 +1,3 @@ -# vite-plugin-jsx +# vite-plugin-mdx -Modifies Vite’s built-in JSX behavior to allow for React, Preact, and Solid.js to coexist and all use `.jsx` and `.tsx` extensions. +Handles transforming MDX via the `astro:jsx` renderer. diff --git a/packages/astro/src/vite-plugin-mdx/index.ts b/packages/astro/src/vite-plugin-mdx/index.ts index 94fef27830b9..7e86aed288f4 100644 --- a/packages/astro/src/vite-plugin-mdx/index.ts +++ b/packages/astro/src/vite-plugin-mdx/index.ts @@ -1,99 +1,19 @@ -import type { TransformResult } from 'rollup'; -import { type Plugin, type ResolvedConfig, transformWithEsbuild } from 'vite'; -import type { AstroRenderer, AstroSettings } from '../@types/astro.js'; -import type { Logger } from '../core/logger/core.js'; -import type { PluginMetadata } from '../vite-plugin-astro/types.js'; - -import babel from '@babel/core'; +import { type Plugin, transformWithEsbuild } from 'vite'; import { CONTENT_FLAG, PROPAGATED_ASSET_FLAG } from '../content/index.js'; import { astroEntryPrefix } from '../core/build/plugins/plugin-component-entry.js'; import { removeQueryString } from '../core/path.js'; -import tagExportsPlugin from './tag.js'; - -interface TransformJSXOptions { - code: string; - id: string; - mode: string; - renderer: AstroRenderer; - ssr: boolean; - root: URL; -} - -async function transformJSX({ - code, - mode, - id, - ssr, - renderer, - root, -}: TransformJSXOptions): Promise { - const { jsxTransformOptions } = renderer; - const options = await jsxTransformOptions!({ mode, ssr }); - const plugins = [...(options.plugins || [])]; - if (ssr) { - plugins.push(await tagExportsPlugin({ rendererName: renderer.name, root })); - } - const result = await babel.transformAsync(code, { - presets: options.presets, - plugins, - cwd: process.cwd(), - filename: id, - ast: false, - compact: false, - sourceMaps: true, - configFile: false, - babelrc: false, - inputSourceMap: options.inputSourceMap, - }); - // TODO: Be more strict about bad return values here. - // Should we throw an error instead? Should we never return `{code: ""}`? - if (!result) return null; - - if (renderer.name === 'astro:jsx') { - const { astro } = result.metadata as unknown as PluginMetadata; - return { - code: result.code || '', - map: result.map, - meta: { - astro, - vite: { - // Setting this vite metadata to `ts` causes Vite to resolve .js - // extensions to .ts files. - lang: 'ts', - }, - }, - }; - } - - return { - code: result.code || '', - map: result.map, - }; -} - -interface AstroPluginJSXOptions { - settings: AstroSettings; - logger: Logger; -} +import { transformJSX } from './transform-jsx.js'; // Format inspired by https://github.com/vitejs/vite/blob/main/packages/vite/src/node/constants.ts#L54 const SPECIAL_QUERY_REGEX = new RegExp( `[?&](?:worker|sharedworker|raw|url|${CONTENT_FLAG}|${PROPAGATED_ASSET_FLAG})\\b` ); -/** Use Astro config to allow for alternate or multiple JSX renderers (by default Vite will assume React) */ -export default function mdxVitePlugin({ settings }: AstroPluginJSXOptions): Plugin { - let viteConfig: ResolvedConfig; - // A reference to Astro's internal JSX renderer. - let astroJSXRenderer: AstroRenderer; - +// TODO: Move this Vite plugin into `@astrojs/mdx` in Astro 5 +export default function mdxVitePlugin(): Plugin { return { name: 'astro:jsx', enforce: 'pre', // run transforms before other plugins - async configResolved(resolvedConfig) { - viteConfig = resolvedConfig; - astroJSXRenderer = settings.renderers.find((r) => r.jsxImportSource === 'astro')!; - }, async transform(code, id, opts) { // Skip special queries and astro entries. We skip astro entries here as we know it doesn't contain // JSX code, and also because we can't detect the import source to apply JSX transforms. @@ -117,14 +37,7 @@ export default function mdxVitePlugin({ settings }: AstroPluginJSXOptions): Plug }, }, }); - return transformJSX({ - code: jsxCode, - id, - renderer: astroJSXRenderer, - mode: viteConfig.mode, - ssr: Boolean(opts?.ssr), - root: settings.config.root, - }); + return await transformJSX(jsxCode, id, opts?.ssr); }, }; } diff --git a/packages/astro/src/vite-plugin-mdx/tag.ts b/packages/astro/src/vite-plugin-mdx/tag.ts index b7ae1f2c44ed..3b774a0a238d 100644 --- a/packages/astro/src/vite-plugin-mdx/tag.ts +++ b/packages/astro/src/vite-plugin-mdx/tag.ts @@ -1,5 +1,8 @@ import type { PluginObj } from '@babel/core'; import * as t from '@babel/types'; +import astroJsxRenderer from '../jsx/renderer.js'; + +const rendererName = astroJsxRenderer.name; /** * This plugin handles every file that runs through our JSX plugin. @@ -9,115 +12,100 @@ import * as t from '@babel/types'; * This plugin crawls each export in the file and "tags" each export with a given `rendererName`. * This allows us to automatically match a component to a renderer and skip the usual `check()` calls. */ -export default async function tagExportsWithRenderer({ - rendererName, -}: { - rendererName: string; - root: URL; -}): Promise { - return { - visitor: { - Program: { - // Inject `import { __astro_tag_component__ } from 'astro/runtime/server/index.js'` - enter(path) { - path.node.body.splice( - 0, - 0, - t.importDeclaration( - [ - t.importSpecifier( - t.identifier('__astro_tag_component__'), - t.identifier('__astro_tag_component__') - ), - ], - t.stringLiteral('astro/runtime/server/index.js') - ) - ); - }, - // For each export we found, inject `__astro_tag_component__(exportName, rendererName)` - exit(path, state) { - const exportedIds = state.get('astro:tags'); - if (exportedIds) { - for (const id of exportedIds) { - path.node.body.push( - t.expressionStatement( - t.callExpression(t.identifier('__astro_tag_component__'), [ - t.identifier(id), - t.stringLiteral(rendererName), - ]) - ) - ); - } - } - }, +export const tagExportsPlugin: PluginObj = { + visitor: { + Program: { + // Inject `import { __astro_tag_component__ } from 'astro/runtime/server/index.js'` + enter(path) { + path.node.body.splice( + 0, + 0, + t.importDeclaration( + [ + t.importSpecifier( + t.identifier('__astro_tag_component__'), + t.identifier('__astro_tag_component__') + ), + ], + t.stringLiteral('astro/runtime/server/index.js') + ) + ); }, - ExportDeclaration: { - /** - * For default anonymous function export, we need to give them a unique name - * @param path - * @returns - */ - enter(path) { - const node = path.node; - if (!t.isExportDefaultDeclaration(node)) return; - - if ( - t.isArrowFunctionExpression(node.declaration) || - t.isCallExpression(node.declaration) - ) { - const varName = t.isArrowFunctionExpression(node.declaration) - ? '_arrow_function' - : '_hoc_function'; - const uidIdentifier = path.scope.generateUidIdentifier(varName); - path.insertBefore( - t.variableDeclaration('const', [ - t.variableDeclarator(uidIdentifier, node.declaration), - ]) + // For each export we found, inject `__astro_tag_component__(exportName, rendererName)` + exit(path, state) { + const exportedIds = state.get('astro:tags'); + if (exportedIds) { + for (const id of exportedIds) { + path.node.body.push( + t.expressionStatement( + t.callExpression(t.identifier('__astro_tag_component__'), [ + t.identifier(id), + t.stringLiteral(rendererName), + ]) + ) ); - node.declaration = uidIdentifier; - } else if (t.isFunctionDeclaration(node.declaration) && !node.declaration.id?.name) { - const uidIdentifier = path.scope.generateUidIdentifier('_function'); - node.declaration.id = uidIdentifier; } - }, - exit(path, state) { - const node = path.node; - if (node.exportKind === 'type') return; - if (t.isExportAllDeclaration(node)) return; - const addTag = (id: string) => { - const tags = state.get('astro:tags') ?? []; - state.set('astro:tags', [...tags, id]); - }; - if (t.isExportNamedDeclaration(node) || t.isExportDefaultDeclaration(node)) { - if (t.isIdentifier(node.declaration)) { - addTag(node.declaration.name); - } else if (t.isFunctionDeclaration(node.declaration) && node.declaration.id?.name) { - addTag(node.declaration.id.name); - } else if (t.isVariableDeclaration(node.declaration)) { - node.declaration.declarations?.forEach((declaration) => { - if ( - t.isArrowFunctionExpression(declaration.init) && - t.isIdentifier(declaration.id) - ) { - addTag(declaration.id.name); - } - }); - } else if (t.isObjectExpression(node.declaration)) { - node.declaration.properties?.forEach((property) => { - if (t.isProperty(property) && t.isIdentifier(property.key)) { - addTag(property.key.name); - } - }); - } else if (t.isExportNamedDeclaration(node) && !node.source) { - node.specifiers.forEach((specifier) => { - if (t.isExportSpecifier(specifier) && t.isIdentifier(specifier.exported)) { - addTag(specifier.local.name); - } - }); - } + } + }, + }, + ExportDeclaration: { + /** + * For default anonymous function export, we need to give them a unique name + * @param path + * @returns + */ + enter(path) { + const node = path.node; + if (!t.isExportDefaultDeclaration(node)) return; + + if (t.isArrowFunctionExpression(node.declaration) || t.isCallExpression(node.declaration)) { + const varName = t.isArrowFunctionExpression(node.declaration) + ? '_arrow_function' + : '_hoc_function'; + const uidIdentifier = path.scope.generateUidIdentifier(varName); + path.insertBefore( + t.variableDeclaration('const', [t.variableDeclarator(uidIdentifier, node.declaration)]) + ); + node.declaration = uidIdentifier; + } else if (t.isFunctionDeclaration(node.declaration) && !node.declaration.id?.name) { + const uidIdentifier = path.scope.generateUidIdentifier('_function'); + node.declaration.id = uidIdentifier; + } + }, + exit(path, state) { + const node = path.node; + if (node.exportKind === 'type') return; + if (t.isExportAllDeclaration(node)) return; + const addTag = (id: string) => { + const tags = state.get('astro:tags') ?? []; + state.set('astro:tags', [...tags, id]); + }; + if (t.isExportNamedDeclaration(node) || t.isExportDefaultDeclaration(node)) { + if (t.isIdentifier(node.declaration)) { + addTag(node.declaration.name); + } else if (t.isFunctionDeclaration(node.declaration) && node.declaration.id?.name) { + addTag(node.declaration.id.name); + } else if (t.isVariableDeclaration(node.declaration)) { + node.declaration.declarations?.forEach((declaration) => { + if (t.isArrowFunctionExpression(declaration.init) && t.isIdentifier(declaration.id)) { + addTag(declaration.id.name); + } + }); + } else if (t.isObjectExpression(node.declaration)) { + node.declaration.properties?.forEach((property) => { + if (t.isProperty(property) && t.isIdentifier(property.key)) { + addTag(property.key.name); + } + }); + } else if (t.isExportNamedDeclaration(node) && !node.source) { + node.specifiers.forEach((specifier) => { + if (t.isExportSpecifier(specifier) && t.isIdentifier(specifier.exported)) { + addTag(specifier.local.name); + } + }); } - }, + } }, }, - }; -} + }, +}; diff --git a/packages/astro/src/vite-plugin-mdx/transform-jsx.ts b/packages/astro/src/vite-plugin-mdx/transform-jsx.ts new file mode 100644 index 000000000000..07eb87d0465e --- /dev/null +++ b/packages/astro/src/vite-plugin-mdx/transform-jsx.ts @@ -0,0 +1,69 @@ +import babel from '@babel/core'; +import type { TransformResult } from 'rollup'; +import type { JSXTransformConfig } from '../@types/astro.js'; +import { jsxTransformOptions } from '../jsx/transform-options.js'; +import type { PluginMetadata } from '../vite-plugin-astro/types.js'; +import { tagExportsPlugin } from './tag.js'; + +export async function transformJSX( + code: string, + id: string, + ssr?: boolean +): Promise { + const options = await getJsxTransformOptions(); + const plugins = ssr ? [...(options.plugins ?? []), tagExportsPlugin] : options.plugins; + + const result = await babel.transformAsync(code, { + presets: options.presets, + plugins, + cwd: process.cwd(), + filename: id, + ast: false, + compact: false, + sourceMaps: true, + configFile: false, + babelrc: false, + browserslistConfigFile: false, + inputSourceMap: options.inputSourceMap, + }); + + // TODO: Be more strict about bad return values here. + // Should we throw an error instead? Should we never return `{code: ""}`? + if (!result) return null; + + const { astro } = result.metadata as unknown as PluginMetadata; + return { + code: result.code || '', + map: result.map, + meta: { + astro, + vite: { + // Setting this vite metadata to `ts` causes Vite to resolve .js + // extensions to .ts files. + lang: 'ts', + }, + }, + }; +} + +let cachedJsxTransformOptions: Promise | JSXTransformConfig | undefined; + +/** + * Get the `jsxTransformOptions` with caching + */ +async function getJsxTransformOptions(): Promise { + if (cachedJsxTransformOptions) { + return cachedJsxTransformOptions; + } + + const options = jsxTransformOptions(); + + // Cache the promise + cachedJsxTransformOptions = options; + // After the promise is resolved, cache the final resolved options + options.then((resolvedOptions) => { + cachedJsxTransformOptions = resolvedOptions; + }); + + return options; +} diff --git a/packages/astro/test/units/render/jsx.test.js b/packages/astro/test/units/render/jsx.test.js index 0f91ccfc9712..3e1b01b23e8e 100644 --- a/packages/astro/test/units/render/jsx.test.js +++ b/packages/astro/test/units/render/jsx.test.js @@ -15,6 +15,7 @@ import { createBasicPipeline } from '../test-utils.js'; const createAstroModule = (AstroComponent) => ({ default: AstroComponent }); const loadJSXRenderer = () => loadRenderer(jsxRenderer, { import: (s) => import(s) }); +// NOTE: This test may be testing an outdated JSX setup describe('core/render', () => { describe('Astro JSX components', () => { let pipeline; From 29a705370bae99ff02f95623940cc9ae85adf2af Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 8 Apr 2024 14:38:59 +0800 Subject: [PATCH 17/96] Fix vue-jsx change (#10716) --- packages/integrations/vue/src/index.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/integrations/vue/src/index.ts b/packages/integrations/vue/src/index.ts index f2efc102bc7b..3604b6d64441 100644 --- a/packages/integrations/vue/src/index.ts +++ b/packages/integrations/vue/src/index.ts @@ -19,6 +19,14 @@ function getRenderer(): AstroRenderer { }; } +function getJsxRenderer(): AstroRenderer { + return { + name: '@astrojs/vue (jsx)', + clientEntrypoint: '@astrojs/vue/client.js', + serverEntrypoint: '@astrojs/vue/server.js', + }; +} + function virtualAppEntrypoint(options?: Options): Plugin { const virtualModuleId = 'virtual:@astrojs/vue/app'; const resolvedVirtualModuleId = '\0' + virtualModuleId; @@ -120,6 +128,9 @@ export default function (options?: Options): AstroIntegration { hooks: { 'astro:config:setup': async ({ addRenderer, updateConfig }) => { addRenderer(getRenderer()); + if (options?.jsx) { + addRenderer(getJsxRenderer()); + } updateConfig({ vite: await getViteConfiguration(options) }); }, }, From 094eb6e684af0871919da3440a2e45f82210834f Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 8 Apr 2024 18:53:50 +0800 Subject: [PATCH 18/96] Fix script inline with directRenderScript (#10686) --- .changeset/sour-chairs-compare.md | 5 +++++ .../src/core/build/plugins/plugin-scripts.ts | 17 +++++++++++++++-- .../src/components/shared-scripts/A.astro | 1 + .../src/components/shared-scripts/B.astro | 4 ++++ .../src/components/shared-scripts/script.ts | 1 + .../src/pages/no-inline-if-shared.astro | 7 +++++++ packages/astro/test/hoisted-imports.test.js | 11 ++++++++++- 7 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 .changeset/sour-chairs-compare.md create mode 100644 packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/A.astro create mode 100644 packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/B.astro create mode 100644 packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/script.ts create mode 100644 packages/astro/test/fixtures/hoisted-imports/src/pages/no-inline-if-shared.astro diff --git a/.changeset/sour-chairs-compare.md b/.changeset/sour-chairs-compare.md new file mode 100644 index 000000000000..f11972309883 --- /dev/null +++ b/.changeset/sour-chairs-compare.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Prevents inlining scripts if used by other chunks when using the `experimental.directRenderScript` option diff --git a/packages/astro/src/core/build/plugins/plugin-scripts.ts b/packages/astro/src/core/build/plugins/plugin-scripts.ts index effbdb684270..52a2e3c4a3e3 100644 --- a/packages/astro/src/core/build/plugins/plugin-scripts.ts +++ b/packages/astro/src/core/build/plugins/plugin-scripts.ts @@ -17,18 +17,31 @@ export function vitePluginScripts(internals: BuildInternals): VitePlugin { }, async generateBundle(_options, bundle) { - for (const [id, output] of Object.entries(bundle)) { + const outputs = Object.values(bundle); + + // Track ids that are imported by chunks so we don't inline scripts that are imported + const importedIds = new Set(); + for (const output of outputs) { + if (output.type === 'chunk') { + for (const id of output.imports) { + importedIds.add(id); + } + } + } + + for (const output of outputs) { // Try to inline scripts that don't import anything as is within the inline limit if ( output.type === 'chunk' && output.facadeModuleId && internals.discoveredScripts.has(output.facadeModuleId) && + !importedIds.has(output.fileName) && output.imports.length === 0 && output.dynamicImports.length === 0 && shouldInlineAsset(output.code, output.fileName, assetInlineLimit) ) { internals.inlinedScripts.set(output.facadeModuleId, output.code.trim()); - delete bundle[id]; + delete bundle[output.fileName]; } } }, diff --git a/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/A.astro b/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/A.astro new file mode 100644 index 000000000000..c1161dd81f81 --- /dev/null +++ b/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/A.astro @@ -0,0 +1 @@ + diff --git a/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/B.astro b/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/B.astro new file mode 100644 index 000000000000..967a4e295ab8 --- /dev/null +++ b/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/B.astro @@ -0,0 +1,4 @@ + diff --git a/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/script.ts b/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/script.ts new file mode 100644 index 000000000000..a3d42c010835 --- /dev/null +++ b/packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/script.ts @@ -0,0 +1 @@ +console.log('shared-scripts'); diff --git a/packages/astro/test/fixtures/hoisted-imports/src/pages/no-inline-if-shared.astro b/packages/astro/test/fixtures/hoisted-imports/src/pages/no-inline-if-shared.astro new file mode 100644 index 000000000000..a62f6d26b125 --- /dev/null +++ b/packages/astro/test/fixtures/hoisted-imports/src/pages/no-inline-if-shared.astro @@ -0,0 +1,7 @@ +--- +import A from '../components/shared-scripts/A.astro' +import B from '../components/shared-scripts/B.astro' +--- + + + diff --git a/packages/astro/test/hoisted-imports.test.js b/packages/astro/test/hoisted-imports.test.js index 37d1c56be783..fba5d4b5e630 100644 --- a/packages/astro/test/hoisted-imports.test.js +++ b/packages/astro/test/hoisted-imports.test.js @@ -71,12 +71,21 @@ describe('Hoisted Imports', () => { assert.equal($('script').length, 1); }); - it('inlines if script is larger than vite.assetInlineLimit: 100', async () => { + it('does not inline if script is larger than vite.assetInlineLimit: 100', async () => { const html = await fixture.readFile('/no-inline/index.html'); const $ = cheerio.load(html); const scripts = $('script'); assert.equal(scripts.length, 1); assert.ok(scripts[0].attribs.src); }); + + it('does not inline if script it has shared chunks', async () => { + const html = await fixture.readFile('/no-inline-if-shared/index.html'); + const $ = cheerio.load(html); + const scripts = $('script'); + assert.equal(scripts.length, 2); + assert.ok(scripts[0].attribs.src); + assert.ok(scripts[1].attribs.src); + }); }); }); From 3212779e49e20ea57e6f4553cb44b4e8f68d322d Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Mon, 8 Apr 2024 09:21:41 -0400 Subject: [PATCH 19/96] Provide better messaging when renaming a table (#10600) * Provide better messaging when renaming a table * Update based on review --- .changeset/old-planes-walk.md | 5 +++++ packages/db/src/core/cli/commands/push/index.ts | 13 +++++++++++++ packages/db/src/core/cli/migration-queries.ts | 6 +++--- packages/db/src/core/errors.ts | 10 +++++++--- 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 .changeset/old-planes-walk.md diff --git a/.changeset/old-planes-walk.md b/.changeset/old-planes-walk.md new file mode 100644 index 000000000000..46c7da3f4fad --- /dev/null +++ b/.changeset/old-planes-walk.md @@ -0,0 +1,5 @@ +--- +"@astrojs/db": patch +--- + +Provide better messaging when renaming a table diff --git a/packages/db/src/core/cli/commands/push/index.ts b/packages/db/src/core/cli/commands/push/index.ts index ba4a5392fd7d..40c3e795b357 100644 --- a/packages/db/src/core/cli/commands/push/index.ts +++ b/packages/db/src/core/cli/commands/push/index.ts @@ -12,6 +12,7 @@ import { getMigrationQueries, getProductionCurrentSnapshot, } from '../../migration-queries.js'; +import prompts from 'prompts'; export async function cmd({ dbConfig, @@ -41,6 +42,18 @@ export async function cmd({ } if (isForceReset) { + const { begin } = await prompts({ + type: "confirm", + name: "begin", + message: `Reset your database? All of your data will be erased and your schema created from scratch.`, + initial: false + }); + + if(!begin) { + console.log("Canceled."); + process.exit(0); + } + console.log(`Force-pushing to the database. All existing data will be erased.`); } else if (confirmations.length > 0) { console.log('\n' + formatDataLossMessage(confirmations) + '\n'); diff --git a/packages/db/src/core/cli/migration-queries.ts b/packages/db/src/core/cli/migration-queries.ts index bf89a579c8bd..d5fe959cb116 100644 --- a/packages/db/src/core/cli/migration-queries.ts +++ b/packages/db/src/core/cli/migration-queries.ts @@ -64,9 +64,9 @@ export async function getMigrationQueries({ Object.entries(droppedTables).filter(([, table]) => !table.deprecated) ); if (!isEmpty(addedTables) && !isEmpty(notDeprecatedDroppedTables)) { - throw new Error( - RENAME_TABLE_ERROR(Object.keys(addedTables)[0], Object.keys(notDeprecatedDroppedTables)[0]) - ); + const oldTable = Object.keys(notDeprecatedDroppedTables)[0]; + const newTable = Object.keys(addedTables)[0]; + throw new Error(RENAME_TABLE_ERROR(oldTable, newTable)); } for (const [tableName, table] of Object.entries(addedTables)) { diff --git a/packages/db/src/core/errors.ts b/packages/db/src/core/errors.ts index 64ff271d8005..c27b0cba75f5 100644 --- a/packages/db/src/core/errors.ts +++ b/packages/db/src/core/errors.ts @@ -16,9 +16,13 @@ export const MISSING_EXECUTE_PATH_ERROR = `${red( export const RENAME_TABLE_ERROR = (oldTable: string, newTable: string) => { return ( - red('▶ Potential table rename detected: ' + oldTable + ', ' + newTable) + - `\n You cannot add and remove tables in the same schema update batch.` + - `\n To resolve, add a 'deprecated: true' flag to '${oldTable}' instead.` + red("\u25B6 Potential table rename detected: " + oldTable + " -> " + newTable) + ` + You cannot add and remove tables in the same schema update batch. + + 1. Use "deprecated: true" to deprecate a table before renaming. + 2. Use "--force-reset" to ignore this warning and reset the database (deleting all of your data). + + Visit https://docs.astro.build/en/guides/astro-db/#renaming-tables to learn more.` ); }; From 5e502b481cf842ec669d980ba6424fbfe9fe6c18 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Mon, 8 Apr 2024 13:22:48 +0000 Subject: [PATCH 20/96] [ci] format --- .../db/src/core/cli/commands/push/index.ts | 22 +++++++++---------- packages/db/src/core/errors.ts | 3 ++- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/db/src/core/cli/commands/push/index.ts b/packages/db/src/core/cli/commands/push/index.ts index 40c3e795b357..377b3677f409 100644 --- a/packages/db/src/core/cli/commands/push/index.ts +++ b/packages/db/src/core/cli/commands/push/index.ts @@ -1,4 +1,5 @@ import type { AstroConfig } from 'astro'; +import prompts from 'prompts'; import type { Arguments } from 'yargs-parser'; import { safeFetch } from '../../../../runtime/utils.js'; import { MIGRATION_VERSION } from '../../../consts.js'; @@ -12,7 +13,6 @@ import { getMigrationQueries, getProductionCurrentSnapshot, } from '../../migration-queries.js'; -import prompts from 'prompts'; export async function cmd({ dbConfig, @@ -42,17 +42,17 @@ export async function cmd({ } if (isForceReset) { - const { begin } = await prompts({ - type: "confirm", - name: "begin", - message: `Reset your database? All of your data will be erased and your schema created from scratch.`, - initial: false - }); + const { begin } = await prompts({ + type: 'confirm', + name: 'begin', + message: `Reset your database? All of your data will be erased and your schema created from scratch.`, + initial: false, + }); - if(!begin) { - console.log("Canceled."); - process.exit(0); - } + if (!begin) { + console.log('Canceled.'); + process.exit(0); + } console.log(`Force-pushing to the database. All existing data will be erased.`); } else if (confirmations.length > 0) { diff --git a/packages/db/src/core/errors.ts b/packages/db/src/core/errors.ts index c27b0cba75f5..620b2b985fbf 100644 --- a/packages/db/src/core/errors.ts +++ b/packages/db/src/core/errors.ts @@ -16,7 +16,8 @@ export const MISSING_EXECUTE_PATH_ERROR = `${red( export const RENAME_TABLE_ERROR = (oldTable: string, newTable: string) => { return ( - red("\u25B6 Potential table rename detected: " + oldTable + " -> " + newTable) + ` + red('\u25B6 Potential table rename detected: ' + oldTable + ' -> ' + newTable) + + ` You cannot add and remove tables in the same schema update batch. 1. Use "deprecated: true" to deprecate a table before renaming. From 7b80b433b900ef9cd582cf768ba63d8bd142354e Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Mon, 8 Apr 2024 07:14:02 -0700 Subject: [PATCH 21/96] [ci] update lockfile (#10718) Co-authored-by: matthewp --- pnpm-lock.yaml | 825 ++++++++++++++++++++++++------------------------- 1 file changed, 401 insertions(+), 424 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4bda3a095ddc..4833b5fe9eab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,7 +32,7 @@ importers: version: 2.27.1 '@types/node': specifier: ^18.17.8 - version: 18.19.28 + version: 18.19.30 '@typescript-eslint/eslint-plugin': specifier: ^6.11.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.2.2) @@ -56,7 +56,7 @@ importers: version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) eslint-plugin-regexp: specifier: ^2.2.0 - version: 2.4.0(eslint@8.57.0) + version: 2.5.0(eslint@8.57.0) globby: specifier: ^14.0.0 version: 14.0.1 @@ -77,7 +77,7 @@ importers: version: 0.2.9 turbo: specifier: ^1.12.4 - version: 1.13.0 + version: 1.13.2 typescript: specifier: ~5.2.2 version: 5.2.2 @@ -168,7 +168,7 @@ importers: version: 3.13.10 alpinejs: specifier: ^3.13.3 - version: 3.13.7 + version: 3.13.8 astro: specifier: ^4.5.16 version: link:../../packages/astro @@ -207,10 +207,10 @@ importers: version: link:../../packages/integrations/vue '@types/react': specifier: ^18.2.37 - version: 18.2.73 + version: 18.2.74 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.23 + version: 18.2.24 astro: specifier: ^4.5.16 version: link:../../packages/astro @@ -255,10 +255,10 @@ importers: version: link:../../packages/integrations/react '@types/react': specifier: ^18.2.37 - version: 18.2.73 + version: 18.2.74 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.23 + version: 18.2.24 astro: specifier: ^4.5.16 version: link:../../packages/astro @@ -376,7 +376,7 @@ importers: version: link:../../packages/astro sass: specifier: ^1.69.5 - version: 1.72.0 + version: 1.74.1 sharp: specifier: ^0.32.6 version: 0.32.6 @@ -499,7 +499,7 @@ importers: version: link:../../packages/astro vitest: specifier: ^1.3.1 - version: 1.4.0(@types/node@18.19.28) + version: 1.4.0(@types/node@18.19.30) packages/astro: dependencies: @@ -517,16 +517,16 @@ importers: version: link:../telemetry '@babel/core': specifier: ^7.24.3 - version: 7.24.3 + version: 7.24.4 '@babel/generator': specifier: ^7.23.3 - version: 7.24.1 + version: 7.24.4 '@babel/parser': specifier: ^7.23.3 - version: 7.24.1 + version: 7.24.4 '@babel/plugin-transform-react-jsx': specifier: ^7.22.5 - version: 7.23.4(@babel/core@7.24.3) + version: 7.23.4(@babel/core@7.24.4) '@babel/traverse': specifier: ^7.23.3 version: 7.24.1 @@ -622,7 +622,7 @@ importers: version: 4.1.5 magic-string: specifier: ^0.30.3 - version: 0.30.8 + version: 0.30.9 mime: specifier: ^3.0.0 version: 3.0.0 @@ -637,7 +637,7 @@ importers: version: 8.0.1 path-to-regexp: specifier: ^6.2.1 - version: 6.2.1 + version: 6.2.2 preferred-pm: specifier: ^3.1.2 version: 3.1.3 @@ -655,7 +655,7 @@ importers: version: 7.6.0 shiki: specifier: ^1.1.2 - version: 1.2.2 + version: 1.2.4 string-width: specifier: ^7.0.0 version: 7.1.0 @@ -673,10 +673,10 @@ importers: version: 6.0.1 vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) vitefu: specifier: ^0.2.5 - version: 0.2.5(vite@5.2.7) + version: 0.2.5(vite@5.2.8) which-pm: specifier: ^2.1.1 version: 2.1.1 @@ -807,10 +807,10 @@ importers: version: 0.1.2 rollup: specifier: ^4.5.0 - version: 4.13.2 + version: 4.14.1 sass: specifier: ^1.69.5 - version: 1.72.0 + version: 1.74.1 srcset-parse: specifier: ^1.1.0 version: 1.1.0 @@ -987,7 +987,7 @@ importers: version: link:../../.. sass: specifier: ^1.69.5 - version: 1.72.0 + version: 1.74.1 packages/astro/e2e/fixtures/errors: dependencies: @@ -1020,7 +1020,7 @@ importers: version: 18.2.0(react@18.2.0) sass: specifier: ^1.69.5 - version: 1.72.0 + version: 1.74.1 solid-js: specifier: ^1.8.5 version: 1.8.16 @@ -1038,7 +1038,7 @@ importers: version: link:../../.. sass: specifier: ^1.69.5 - version: 1.72.0 + version: 1.74.1 packages/astro/e2e/fixtures/hydration-race: dependencies: @@ -1628,10 +1628,10 @@ importers: version: link:../utils '@types/react': specifier: ^18.2.37 - version: 18.2.73 + version: 18.2.74 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.23 + version: 18.2.24 astro: specifier: workspace:* version: link:../../.. @@ -1655,10 +1655,10 @@ importers: version: link:../utils '@types/react': specifier: ^18.2.37 - version: 18.2.73 + version: 18.2.74 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.23 + version: 18.2.24 astro: specifier: workspace:* version: link:../../.. @@ -1682,10 +1682,10 @@ importers: version: link:../utils '@types/react': specifier: ^18.2.37 - version: 18.2.73 + version: 18.2.74 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.23 + version: 18.2.24 astro: specifier: workspace:* version: link:../../.. @@ -3177,7 +3177,7 @@ importers: devDependencies: postcss-preset-env: specifier: ^9.3.0 - version: 9.5.3(postcss@8.4.38) + version: 9.5.4(postcss@8.4.38) packages/astro/test/fixtures/preact-compat-component: dependencies: @@ -3855,7 +3855,7 @@ importers: version: 1.0.2 drizzle-orm: specifier: ^0.30.4 - version: 0.30.6(@libsql/client@0.5.6) + version: 0.30.7(@libsql/client@0.5.6) github-slugger: specifier: ^2.0.0 version: 2.0.0 @@ -3864,7 +3864,7 @@ importers: version: 4.1.5 nanoid: specifier: ^5.0.1 - version: 5.0.6 + version: 5.0.7 open: specifier: ^10.0.3 version: 10.1.0 @@ -3919,10 +3919,10 @@ importers: version: 10.4.0 typescript: specifier: ^5.2.2 - version: 5.4.3 + version: 5.4.4 vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) packages/db/test/fixtures/basics: dependencies: @@ -4009,7 +4009,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.5.5 - version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.3) + version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4) '@astrojs/db': specifier: workspace:* version: link:../../.. @@ -4021,16 +4021,16 @@ importers: version: link:../../../../integrations/react '@types/react': specifier: ^18.2.57 - version: 18.2.73 + version: 18.2.74 '@types/react-dom': specifier: ^18.2.19 - version: 18.2.23 + version: 18.2.24 astro: specifier: workspace:* version: link:../../../../astro open-props: specifier: ^1.6.17 - version: 1.6.21 + version: 1.7.2 react: specifier: ^18.2.0 version: 18.2.0 @@ -4042,7 +4042,7 @@ importers: version: 0.1.12(astro@packages+astro)(zod@3.22.4) typescript: specifier: ^5.3.2 - version: 5.4.3 + version: 5.4.4 zod: specifier: ^3.22.4 version: 3.22.4 @@ -4060,7 +4060,7 @@ importers: version: link:../../../scripts vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) packages/integrations/alpinejs/test/fixtures/basics: dependencies: @@ -4072,7 +4072,7 @@ importers: version: 3.13.10 alpinejs: specifier: ^3.13.3 - version: 3.13.7 + version: 3.13.8 astro: specifier: workspace:* version: link:../../../../../astro @@ -4087,7 +4087,7 @@ importers: version: 3.13.10 alpinejs: specifier: ^3.13.3 - version: 3.13.7 + version: 3.13.8 astro: specifier: workspace:* version: link:../../../../../astro @@ -4102,7 +4102,7 @@ importers: version: 3.13.10 alpinejs: specifier: ^3.13.3 - version: 3.13.7 + version: 3.13.8 astro: specifier: workspace:* version: link:../../../../../astro @@ -4138,7 +4138,7 @@ importers: version: 3.1.2 sass: specifier: ^1.69.5 - version: 1.72.0 + version: 1.74.1 packages/integrations/markdoc: dependencies: @@ -4193,7 +4193,7 @@ importers: version: 0.16.11 vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) packages/integrations/markdoc/test/fixtures/content-collections: dependencies: @@ -4352,7 +4352,7 @@ importers: version: 4.0.3 hast-util-to-html: specifier: ^9.0.0 - version: 9.0.0 + version: 9.0.1 kleur: specifier: ^4.1.4 version: 4.1.5 @@ -4434,7 +4434,7 @@ importers: version: 11.0.4 vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) packages/integrations/mdx/test/fixtures/css-head-mdx: dependencies: @@ -4587,7 +4587,7 @@ importers: devDependencies: '@types/node': specifier: ^18.17.8 - version: 18.19.28 + version: 18.19.30 '@types/send': specifier: ^0.17.4 version: 0.17.4 @@ -4756,7 +4756,7 @@ importers: dependencies: '@babel/plugin-transform-react-jsx': specifier: ^7.22.5 - version: 7.23.4(@babel/core@7.24.3) + version: 7.23.4(@babel/core@7.24.4) '@babel/plugin-transform-react-jsx-development': specifier: ^7.22.5 version: 7.22.5 @@ -4790,17 +4790,17 @@ importers: dependencies: '@vitejs/plugin-react': specifier: ^4.2.0 - version: 4.2.1(vite@5.2.7) + version: 4.2.1(vite@5.2.8) ultrahtml: specifier: ^1.3.0 version: 1.5.3 devDependencies: '@types/react': specifier: ^18.2.37 - version: 18.2.73 + version: 18.2.74 '@types/react-dom': specifier: ^18.2.15 - version: 18.2.23 + version: 18.2.24 astro: specifier: workspace:* version: link:../../astro @@ -4818,7 +4818,7 @@ importers: version: 18.2.0(react@18.2.0) vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) packages/integrations/react/test/fixtures/react-component: dependencies: @@ -4919,7 +4919,7 @@ importers: dependencies: '@sveltejs/vite-plugin-svelte': specifier: ^3.0.0 - version: 3.0.2(svelte@4.2.12)(vite@5.2.7) + version: 3.0.2(svelte@4.2.12)(vite@5.2.8) svelte2tsx: specifier: ^0.6.27 version: 0.6.27(svelte@4.2.12)(typescript@5.2.2) @@ -4935,7 +4935,7 @@ importers: version: 4.2.12 vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) packages/integrations/tailwind: dependencies: @@ -4960,7 +4960,7 @@ importers: version: 3.4.3 vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) packages/integrations/tailwind/test/fixtures/basic: dependencies: @@ -5195,10 +5195,10 @@ importers: dependencies: '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.2.7)(vue@3.4.21) + version: 5.0.4(vite@5.2.8)(vue@3.4.21) '@vitejs/plugin-vue-jsx': specifier: ^3.1.0 - version: 3.1.0(vite@5.2.7)(vue@3.4.21) + version: 3.1.0(vite@5.2.8)(vue@3.4.21) '@vue/compiler-sfc': specifier: ^3.3.8 version: 3.4.21 @@ -5220,7 +5220,7 @@ importers: version: 0.16.11 vite: specifier: ^5.1.4 - version: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + version: 5.2.8(@types/node@18.19.30)(sass@1.74.1) vue: specifier: ^3.3.8 version: 3.4.21(typescript@5.2.2) @@ -5316,7 +5316,7 @@ importers: version: 2.0.1 hast-util-to-text: specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.1 import-meta-resolve: specifier: ^4.0.0 version: 4.0.0 @@ -5343,7 +5343,7 @@ importers: version: 2.1.0 shiki: specifier: ^1.1.2 - version: 1.2.2 + version: 1.2.4 unified: specifier: ^11.0.4 version: 11.0.4 @@ -5420,7 +5420,7 @@ importers: version: 1.1.4 '@types/node': specifier: ^18.17.8 - version: 18.19.28 + version: 18.19.30 '@types/which-pm-runs': specifier: ^1.0.2 version: 1.0.2 @@ -5494,7 +5494,7 @@ importers: devDependencies: '@octokit/action': specifier: ^6.0.5 - version: 6.0.7 + version: 6.1.0 del: specifier: ^7.0.0 version: 7.1.0 @@ -5593,17 +5593,17 @@ packages: - prettier-plugin-astro dev: true - /@astrojs/check@0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.3): + /@astrojs/check@0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4): resolution: {integrity: sha512-vliHXM9cu/viGeKiksUM4mXfO816ohWtawTl2ADPgTsd4nUMjFiyAl7xFZhF34yy4hq4qf7jvK1F2PlR3b5I5w==} hasBin: true peerDependencies: typescript: ^5.0.0 dependencies: - '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.3) + '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.4.3 + typescript: 5.4.4 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -5667,7 +5667,7 @@ packages: - typescript dev: true - /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.3): + /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4): resolution: {integrity: sha512-sJH5vGTBkhgA8+hdhzX78UUp4cFz4Mt7xkEkevD188OS5bDMkaue6hK+dtXWM47mnrXFveXA2u38K7S+5+IRjA==} hasBin: true peerDependencies: @@ -5681,7 +5681,7 @@ packages: dependencies: '@astrojs/compiler': 2.7.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.1.6(typescript@5.4.3) + '@volar/kit': 2.1.6(typescript@5.4.4) '@volar/language-core': 2.1.6 '@volar/language-server': 2.1.6 '@volar/language-service': 2.1.6 @@ -5708,22 +5708,22 @@ packages: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - /@babel/compat-data@7.24.1: - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} dev: false - /@babel/core@7.24.3: - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@babel/generator': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 '@babel/template': 7.24.0 '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 @@ -5736,8 +5736,8 @@ packages: - supports-color dev: false - /@babel/generator@7.24.1: - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 @@ -5757,15 +5757,15 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.1 + '@babel/compat-data': 7.24.4 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 dev: false - /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5773,13 +5773,13 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 @@ -5833,7 +5833,7 @@ packages: '@babel/types': 7.24.0 dev: false - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -5842,7 +5842,7 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 @@ -5862,7 +5862,7 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -5871,7 +5871,7 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -5911,8 +5911,8 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helpers@7.24.1: - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 @@ -5931,14 +5931,14 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.0 - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -5947,11 +5947,11 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -5960,7 +5960,7 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -5973,10 +5973,10 @@ packages: '@babel/core': optional: true dependencies: - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) dev: false - /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} engines: {node: '>=6.9.0'} peerDependencies: @@ -5985,11 +5985,11 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -5998,11 +5998,11 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -6011,16 +6011,16 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) '@babel/types': 7.24.0 dev: false - /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} + /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6028,15 +6028,15 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) dev: false - /@babel/runtime@7.24.1: - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -6047,7 +6047,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 dev: false @@ -6056,12 +6056,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@babel/generator': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 @@ -6174,7 +6174,7 @@ packages: /@changesets/apply-release-plan@7.0.0: resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/config': 3.0.0 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.0 @@ -6192,7 +6192,7 @@ packages: /@changesets/assemble-release-plan@6.0.0: resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.0.0 '@changesets/types': 6.0.0 @@ -6220,7 +6220,7 @@ packages: resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} hasBin: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/apply-release-plan': 7.0.0 '@changesets/assemble-release-plan': 6.0.0 '@changesets/changelog-git': 0.2.0 @@ -6294,7 +6294,7 @@ packages: /@changesets/get-release-plan@4.0.0: resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/assemble-release-plan': 6.0.0 '@changesets/config': 3.0.0 '@changesets/pre': 2.0.0 @@ -6310,7 +6310,7 @@ packages: /@changesets/git@3.0.0: resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -6335,7 +6335,7 @@ packages: /@changesets/pre@2.0.0: resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -6345,7 +6345,7 @@ packages: /@changesets/read@0.6.0: resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/git': 3.0.0 '@changesets/logger': 0.1.0 '@changesets/parse': 0.4.0 @@ -6370,7 +6370,7 @@ packages: /@changesets/write@0.3.0: resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 @@ -6600,8 +6600,8 @@ packages: postcss-selector-parser: 6.0.16 dev: true - /@csstools/postcss-light-dark-function@1.0.2(postcss@8.4.38): - resolution: {integrity: sha512-9OUOKCXzYQFdvpRIz7vDucZiRupwFExDAk0YEPYCuKR1ZzQiqNUJSF7/OazjrNlwgt8lDWN9ADxmx5Iapyy6Aw==} + /@csstools/postcss-light-dark-function@1.0.3(postcss@8.4.38): + resolution: {integrity: sha512-izW8hvhOqJlarLcGXO5PSylW9pQS3fytmhRdx2/e1oZFi15vs7ZShOHcREHJ3FfGdYqDA10cP9uhH0A3hmm1Rw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -7264,7 +7264,7 @@ packages: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.2 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -7276,8 +7276,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true /@img/sharp-darwin-arm64@0.33.3: @@ -7641,7 +7641,7 @@ packages: '@lit-labs/ssr-dom-shim': 1.2.0 '@lit/reactive-element': 2.0.4 '@parse5/tools': 0.3.0 - '@types/node': 16.18.93 + '@types/node': 16.18.95 enhanced-resolve: 5.16.0 lit: 3.1.2 lit-element: 4.0.4 @@ -7664,7 +7664,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -7673,7 +7673,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -7777,24 +7777,24 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - /@octokit/action@6.0.7: - resolution: {integrity: sha512-0Q1L96F8JsNb+M2NzN7r4artGyX02Pa9tzg+JaxXncvdHEXVIJFnkA8CstC52EB4DAZ0b8wpqDOG05v/DcyS3g==} + /@octokit/action@6.1.0: + resolution: {integrity: sha512-lo+nHx8kAV86bxvOVOI3vFjX3gXPd/L7guAUbvs3pUvnR2KC+R7yjBkA1uACt4gYhs4LcWP3AXSGQzsbeN2XXw==} engines: {node: '>= 18'} dependencies: - '@octokit/auth-action': 4.0.1 - '@octokit/core': 5.1.0 - '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.1.0) - '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.1.0) + '@octokit/auth-action': 4.1.0 + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) '@octokit/types': 12.6.0 - undici: 6.10.2 + undici: 6.12.0 dev: true - /@octokit/auth-action@4.0.1: - resolution: {integrity: sha512-mJLOcFFafIivLZ7BEkGDCTFoHPJv7BeL5Zwy7j5qMDU0b/DKshhi6GCU9tw3vmKhOxTNquYfvwqsEfPpemaaxg==} + /@octokit/auth-action@4.1.0: + resolution: {integrity: sha512-m+3t7K46IYyMk7Bl6/lF4Rv09GqDZjYmNg8IWycJ2Fa3YE3DE7vQcV6G2hUPmR9NDqenefNJwVtlisMjzymPiQ==} engines: {node: '>= 18'} dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/types': 12.6.0 + '@octokit/types': 13.1.0 dev: true /@octokit/auth-token@4.0.0: @@ -7802,33 +7802,33 @@ packages: engines: {node: '>= 18'} dev: true - /@octokit/core@5.1.0: - resolution: {integrity: sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==} + /@octokit/core@5.2.0: + resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} engines: {node: '>= 18'} dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.0.2 - '@octokit/request': 8.2.0 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.6.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.3.1 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.1.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 dev: true - /@octokit/endpoint@9.0.4: - resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} + /@octokit/endpoint@9.0.5: + resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.6.0 + '@octokit/types': 13.1.0 universal-user-agent: 6.0.1 dev: true - /@octokit/graphql@7.0.2: - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + /@octokit/graphql@7.1.0: + resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} engines: {node: '>= 18'} dependencies: - '@octokit/request': 8.2.0 - '@octokit/types': 12.6.0 + '@octokit/request': 8.3.1 + '@octokit/types': 13.1.0 universal-user-agent: 6.0.1 dev: true @@ -7836,42 +7836,46 @@ packages: resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} dev: true - /@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.1.0): + /@octokit/openapi-types@21.2.0: + resolution: {integrity: sha512-xx+Xd6I7rYvul/hgUDqv6TeGX0IOGnhSg9IOeYgd/uI7IAqUy6DE2B6Ipv2M4mWoxaMcWjIzgTIcv8pMO3F3vw==} + dev: true + + /@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0): resolution: {integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': '5' dependencies: - '@octokit/core': 5.1.0 + '@octokit/core': 5.2.0 '@octokit/types': 12.6.0 dev: true - /@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.1.0): + /@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.0): resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': '5' dependencies: - '@octokit/core': 5.1.0 + '@octokit/core': 5.2.0 '@octokit/types': 12.6.0 dev: true - /@octokit/request-error@5.0.1: - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + /@octokit/request-error@5.1.0: + resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.6.0 + '@octokit/types': 13.1.0 deprecation: 2.3.1 once: 1.4.0 dev: true - /@octokit/request@8.2.0: - resolution: {integrity: sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==} + /@octokit/request@8.3.1: + resolution: {integrity: sha512-fin4cl5eHN5Ybmb/gtn7YZ+ycyUlcyqqkg5lfxeSChqj7sUt6TNaJPehREi+0PABKLREYL8pfaUhH3TicEWNoA==} engines: {node: '>= 18'} dependencies: - '@octokit/endpoint': 9.0.4 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.6.0 + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.1.0 universal-user-agent: 6.0.1 dev: true @@ -7881,6 +7885,12 @@ packages: '@octokit/openapi-types': 20.0.0 dev: true + /@octokit/types@13.1.0: + resolution: {integrity: sha512-nBwAFOYqVUUJ2AZFK4ZzESQptaAVqdTDKk8gE0Xr0o99WuPDSrhUC38x0F40xD9OUxXhOOuZKWNNVVLPSHQDvQ==} + dependencies: + '@octokit/openapi-types': 21.2.0 + dev: true + /@parse5/tools@0.3.0: resolution: {integrity: sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==} dependencies: @@ -7917,7 +7927,7 @@ packages: vite: optional: true dependencies: - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) '@babel/plugin-transform-react-jsx-development': 7.22.5 '@prefresh/vite': 2.4.5(preact@10.20.1) '@rollup/pluginutils': 4.2.1 @@ -7972,7 +7982,7 @@ packages: vite: optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@prefresh/babel-plugin': 0.5.1 '@prefresh/core': 1.5.2(preact@10.20.1) '@prefresh/utils': 1.2.0 @@ -7990,113 +8000,113 @@ packages: picomatch: 2.3.1 dev: false - /@rollup/rollup-android-arm-eabi@4.13.2: - resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==} + /@rollup/rollup-android-arm-eabi@4.14.1: + resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.13.2: - resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==} + /@rollup/rollup-android-arm64@4.14.1: + resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.13.2: - resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==} + /@rollup/rollup-darwin-arm64@4.14.1: + resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.13.2: - resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==} + /@rollup/rollup-darwin-x64@4.14.1: + resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.2: - resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.1: + resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.2: - resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==} + /@rollup/rollup-linux-arm64-gnu@4.14.1: + resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.13.2: - resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==} + /@rollup/rollup-linux-arm64-musl@4.14.1: + resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.13.2: - resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} + /@rollup/rollup-linux-powerpc64le-gnu@4.14.1: + resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==} cpu: [ppc64le] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.2: - resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} + /@rollup/rollup-linux-riscv64-gnu@4.14.1: + resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.13.2: - resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} + /@rollup/rollup-linux-s390x-gnu@4.14.1: + resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.13.2: - resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} + /@rollup/rollup-linux-x64-gnu@4.14.1: + resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.13.2: - resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} + /@rollup/rollup-linux-x64-musl@4.14.1: + resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.2: - resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} + /@rollup/rollup-win32-arm64-msvc@4.14.1: + resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.2: - resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} + /@rollup/rollup-win32-ia32-msvc@4.14.1: + resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.13.2: - resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} + /@rollup/rollup-win32-x64-msvc@4.14.1: + resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@shikijs/core@1.2.2: - resolution: {integrity: sha512-GXbTyNP6HlxpyWMR4eirW54Cxp84nVuivcV5hGVBgKnIl+UmD4AJgCX1uXuNRcFFAw58lB3HqryuezIc0iCLgw==} + /@shikijs/core@1.2.4: + resolution: {integrity: sha512-ClaUWpt8oTzjcF0MM1P81AeWyzc1sNSJlAjMG80CbwqbFqXSNz+NpQVUC0icobt3sZn43Sn27M4pHD/Jmp3zHw==} dev: false /@sinclair/typebox@0.27.8: @@ -8115,7 +8125,7 @@ packages: solid-js: 1.8.16 dev: false - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.7): + /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -8126,15 +8136,15 @@ packages: vite: optional: true dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.7) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.8) debug: 4.3.4(supports-color@8.1.1) svelte: 4.2.12 - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) transitivePeerDependencies: - supports-color dev: false - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.7): + /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8): resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -8144,15 +8154,15 @@ packages: vite: optional: true dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.7) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8) debug: 4.3.4(supports-color@8.1.1) deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.8 + magic-string: 0.30.9 svelte: 4.2.12 svelte-hmr: 0.15.3(svelte@4.2.12) - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) - vitefu: 0.2.5(vite@5.2.7) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + vitefu: 0.2.5(vite@5.2.8) transitivePeerDependencies: - supports-color dev: false @@ -8193,7 +8203,7 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 @@ -8208,7 +8218,7 @@ packages: /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 dev: false @@ -8221,7 +8231,7 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true /@types/canvas-confetti@1.6.4: @@ -8235,7 +8245,7 @@ packages: /@types/clean-css@4.2.11: resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 source-map: 0.6.1 dev: true @@ -8246,7 +8256,7 @@ packages: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true /@types/cookie@0.5.4: @@ -8286,10 +8296,10 @@ packages: /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + /@types/express-serve-static-core@4.19.0: + resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 '@types/qs': 6.9.14 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -8299,9 +8309,9 @@ packages: resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.43 + '@types/express-serve-static-core': 4.19.0 '@types/qs': 6.9.14 - '@types/serve-static': 1.15.5 + '@types/serve-static': 1.15.7 dev: true /@types/hast@3.0.4: @@ -8402,7 +8412,7 @@ packages: /@types/needle@3.3.0: resolution: {integrity: sha512-UFIuc1gdyzAqeVUYpSL+cliw2MmU/ZUhVZKE7Zo4wPbgc8hbljeKSnn6ls6iG8r5jpegPXLUIhJ+Wb2kLVs8cg==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true /@types/nlcst@1.0.4: @@ -8414,7 +8424,7 @@ packages: /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 form-data: 4.0.0 dev: false @@ -8422,21 +8432,21 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@16.18.93: - resolution: {integrity: sha512-epWuohp6c0bQt0j3RYCiP9x52axHVn+CjS1Rx1VjPwF+ySg8lrigH3yXGs88XqnA+jGM2qnSMuFTsBxft+hO1Q==} + /@types/node@16.18.95: + resolution: {integrity: sha512-z9w+CcR7ahc7UhsKe+PGB25nmPmCERQBAdLdFHhoZ6+FfgSr7gUvdQI0eLH2t7ue8u5wKsLdde6cHKPjhC8vGg==} dev: false /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@18.19.28: - resolution: {integrity: sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw==} + /@types/node@18.19.30: + resolution: {integrity: sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==} dependencies: undici-types: 5.26.5 - /@types/node@20.12.2: - resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==} + /@types/node@20.12.5: + resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} dependencies: undici-types: 5.26.5 dev: true @@ -8453,13 +8463,13 @@ packages: resolution: {integrity: sha512-HVqYj3L+D+S/6qpQRv5qMxrD/5pglzZuhP7ZIqgVSZ+Ck4z1TCFkNIRG8WesFueQTqWFTSgkkAl6f8lwxFPQSw==} dependencies: '@types/needle': 3.3.0 - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true /@types/prompts@2.4.9: resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 kleur: 3.0.3 dev: true @@ -8474,13 +8484,13 @@ packages: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} dev: true - /@types/react-dom@18.2.23: - resolution: {integrity: sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==} + /@types/react-dom@18.2.24: + resolution: {integrity: sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==} dependencies: - '@types/react': 18.2.73 + '@types/react': 18.2.74 - /@types/react@18.2.73: - resolution: {integrity: sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==} + /@types/react@18.2.74: + resolution: {integrity: sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==} dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -8496,7 +8506,7 @@ packages: /@types/sax@1.2.7: resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: false /@types/semver@7.5.8: @@ -8507,27 +8517,27 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 18.19.28 + '@types/node': 18.19.30 + '@types/send': 0.17.4 dev: true /@types/server-destroy@1.0.3: resolution: {integrity: sha512-Qq0fn70C7TLDG1W9FCblKufNWW1OckQ41dVKV2Dku5KdZF7bexezG4e2WBaBKhdwL3HZ+cYCEIKwg2BRgzrWmA==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true /@types/set-cookie-parser@2.4.7: resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true /@types/strip-bom@3.0.0: @@ -8564,13 +8574,13 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: false /@types/xml2js@0.4.14: resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 dev: true /@types/yargs-parser@21.0.3: @@ -8778,7 +8788,7 @@ packages: - supports-color dev: false - /@vitejs/plugin-react@4.2.1(vite@5.2.7): + /@vitejs/plugin-react@4.2.1(vite@5.2.8): resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8787,17 +8797,17 @@ packages: vite: optional: true dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) transitivePeerDependencies: - supports-color dev: false - /@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.7)(vue@3.4.21): + /@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.8)(vue@3.4.21): resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8807,16 +8817,16 @@ packages: vite: optional: true dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) - '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.3) - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + '@babel/core': 7.24.4 + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.4) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) vue: 3.4.21(typescript@5.2.2) transitivePeerDependencies: - supports-color dev: false - /@vitejs/plugin-vue@5.0.4(vite@5.2.7)(vue@3.4.21): + /@vitejs/plugin-vue@5.0.4(vite@5.2.8)(vue@3.4.21): resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: @@ -8826,7 +8836,7 @@ packages: vite: optional: true dependencies: - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) vue: 3.4.21(typescript@5.2.2) dev: false @@ -8849,7 +8859,7 @@ packages: /@vitest/snapshot@1.4.0: resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} dependencies: - magic-string: 0.30.8 + magic-string: 0.30.9 pathe: 1.1.2 pretty-format: 29.7.0 dev: false @@ -8882,7 +8892,7 @@ packages: vscode-uri: 3.0.8 dev: true - /@volar/kit@2.1.6(typescript@5.4.3): + /@volar/kit@2.1.6(typescript@5.4.4): resolution: {integrity: sha512-dSuXChDGM0nSG/0fxqlNfadjpAeeo1P1SJPBQ+pDf8H1XrqeJq5gIhxRTEbiS+dyNIG69ATq1CArkbCif+oxJw==} peerDependencies: typescript: '*' @@ -8890,7 +8900,7 @@ packages: '@volar/language-service': 2.1.6 '@volar/typescript': 2.1.6 typesafe-path: 0.2.2 - typescript: 5.4.3 + typescript: 5.4.4 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false @@ -8959,7 +8969,7 @@ packages: resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} dev: false - /@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.3): + /@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.4): resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -8967,15 +8977,15 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) '@babel/template': 7.24.0 '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 '@vue/babel-helper-vue-transform-on': 1.2.2 - '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.24.3) + '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.24.4) camelcase: 6.3.0 html-tags: 3.3.1 svg-tags: 1.0.0 @@ -8983,7 +8993,7 @@ packages: - supports-color dev: false - /@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.3): + /@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.4): resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -8992,17 +9002,17 @@ packages: optional: true dependencies: '@babel/code-frame': 7.24.2 - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@vue/compiler-sfc': 3.4.21 dev: false /@vue/compiler-core@3.4.21: resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@vue/shared': 3.4.21 entities: 4.5.0 estree-walker: 2.0.2 @@ -9017,13 +9027,13 @@ packages: /@vue/compiler-sfc@3.4.21: resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} dependencies: - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@vue/compiler-core': 3.4.21 '@vue/compiler-dom': 3.4.21 '@vue/compiler-ssr': 3.4.21 '@vue/shared': 3.4.21 estree-walker: 2.0.2 - magic-string: 0.30.8 + magic-string: 0.30.9 postcss: 8.4.38 source-map-js: 1.2.0 @@ -9153,8 +9163,8 @@ packages: uri-js: 4.4.1 dev: true - /alpinejs@3.13.7: - resolution: {integrity: sha512-rcTyjTANbsePq1hb7eSekt3qjI94HLGeO6JaRjCssCVbIIc+qBrc7pO5S/+2JB6oojIibjM6FA+xRI3zhGPZIg==} + /alpinejs@3.13.8: + resolution: {integrity: sha512-XolbBJryCndomtaHd/KHQjQeD/L72FJxy/YhLLFD4Lr7zzGcpcbg+UgXteMR2pYg1KhRUr6V4O3GfN1zJAmRWw==} dependencies: '@vue/reactivity': 3.1.5 dev: false @@ -9313,7 +9323,7 @@ packages: peerDependencies: astro: '*' dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 acorn: 8.11.3 astro: link:packages/astro dev: false @@ -9387,7 +9397,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001603 + caniuse-lite: 1.0.30001607 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -9408,10 +9418,9 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - requiresBuild: true dev: false - /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.3): + /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.4): resolution: {integrity: sha512-nef2eLpWBgFggwrYwN6O3dNKn3RnlX6n4DIamNEAeHwp03kVQUaKUiLaEPnHPJHwxie1KwPelyIY9QikU03vUA==} peerDependencies: '@babel/core': ^7.20.12 @@ -9419,9 +9428,9 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) '@babel/types': 7.24.0 html-entities: 2.3.3 validate-html-nesting: 1.2.2 @@ -9436,7 +9445,7 @@ packages: optional: true dev: false - /babel-preset-solid@1.8.16(@babel/core@7.24.3): + /babel-preset-solid@1.8.16(@babel/core@7.24.4): resolution: {integrity: sha512-b4HFg/xaKM+H3Tu5iUlZ/43TJOZnhi85xrm3JrXDQ0s4cmtmU37bXXYzb2m55G4QKiFjxLAjvb7sUorPrAMs5w==} peerDependencies: '@babel/core': ^7.0.0 @@ -9444,8 +9453,8 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.3 - babel-plugin-jsx-dom-expressions: 0.37.19(@babel/core@7.24.3) + '@babel/core': 7.24.4 + babel-plugin-jsx-dom-expressions: 0.37.19(@babel/core@7.24.4) dev: false /bail@2.0.2: @@ -9460,13 +9469,12 @@ packages: dev: false optional: true - /bare-fs@2.2.2: - resolution: {integrity: sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==} + /bare-fs@2.2.3: + resolution: {integrity: sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==} requiresBuild: true dependencies: bare-events: 2.2.2 - bare-os: 2.2.1 - bare-path: 2.1.0 + bare-path: 2.1.1 streamx: 2.16.1 dev: false optional: true @@ -9477,8 +9485,8 @@ packages: dev: false optional: true - /bare-path@2.1.0: - resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} + /bare-path@2.1.1: + resolution: {integrity: sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==} requiresBuild: true dependencies: bare-os: 2.2.1 @@ -9520,7 +9528,6 @@ packages: /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - requiresBuild: true dependencies: buffer: 5.7.1 inherits: 2.0.4 @@ -9604,8 +9611,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001603 - electron-to-chromium: 1.4.722 + caniuse-lite: 1.0.30001607 + electron-to-chromium: 1.4.729 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -9690,8 +9697,8 @@ packages: engines: {node: '>=14.16'} dev: false - /caniuse-lite@1.0.30001603: - resolution: {integrity: sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==} + /caniuse-lite@1.0.30001607: + resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==} /canvas-confetti@1.9.2: resolution: {integrity: sha512-6Xi7aHHzKwxZsem4mCKoqP6YwUG3HamaHHAlz1hTNQPCqXhARFpSXnkC9TWlahHY5CG6hSL5XexNjxK8irVErg==} @@ -9812,7 +9819,6 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - requiresBuild: true dev: false /chownr@2.0.0: @@ -9937,11 +9943,9 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - requiresBuild: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - requiresBuild: true dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 @@ -9955,7 +9959,6 @@ packages: /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} - requiresBuild: true dependencies: color-convert: 2.0.1 color-string: 1.9.1 @@ -10290,7 +10293,6 @@ packages: /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - requiresBuild: true dependencies: mimic-response: 3.1.0 dev: false @@ -10312,7 +10314,6 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - requiresBuild: true dev: false /deep-is@0.1.4: @@ -10519,8 +10520,8 @@ packages: engines: {node: '>=10'} dev: true - /drizzle-orm@0.30.6(@libsql/client@0.5.6): - resolution: {integrity: sha512-8RgNUmY7J03GRuRgBV5SaJNbYgLVPjdSWNS/bRkIMIHt2TFCA439lJsNpqYX8asyKMqkw8ceBiamUnCIXZIt9w==} + /drizzle-orm@0.30.7(@libsql/client@0.5.6): + resolution: {integrity: sha512-9qefSZQlu2fO2qv24piHyWFWcxcOY15//0v4j8qomMqaxzipNoG+fUBrQ7Ftk7PY7APRbRdn/nkEXWxiI4a8mw==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -10534,7 +10535,7 @@ packages: '@types/pg': '*' '@types/react': '>=18' '@types/sql.js': '*' - '@vercel/postgres': '*' + '@vercel/postgres': '>=0.8.0' '@xata.io/client': '*' better-sqlite3: '>=7' bun-types: '*' @@ -10623,8 +10624,8 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.722: - resolution: {integrity: sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==} + /electron-to-chromium@1.4.729: + resolution: {integrity: sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==} /emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -10648,7 +10649,6 @@ packages: /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - requiresBuild: true dependencies: once: 1.4.0 dev: false @@ -10909,8 +10909,8 @@ packages: synckit: 0.8.8 dev: true - /eslint-plugin-regexp@2.4.0(eslint@8.57.0): - resolution: {integrity: sha512-OL2S6VPjQhs9s/NclQ0qattVq1J0GU8ox70/HIVy5Dxw+qbbdd7KQkyucsez2clEQjvdtDe12DTnPphFFUyXFg==} + /eslint-plugin-regexp@2.5.0(eslint@8.57.0): + resolution: {integrity: sha512-I7vKcP0o75WS5SHiVNXN+Eshq49sbrweMQIuqSL3AId9AwDe9Dhbfug65vw64LxmOd4v+yf5l5Xt41y9puiq0g==} engines: {node: ^18 || >=20} peerDependencies: eslint: '>=8.44.0' @@ -11095,7 +11095,6 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - requiresBuild: true dev: false /express@4.19.2: @@ -11170,7 +11169,6 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - requiresBuild: true dev: false /fast-glob@3.3.2: @@ -11333,7 +11331,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - requiresBuild: true dev: false /fs-extra@10.1.0: @@ -11487,7 +11484,6 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - requiresBuild: true dev: false /github-slugger@2.0.0: @@ -11704,7 +11700,7 @@ packages: '@types/unist': 3.0.2 devlop: 1.1.0 hastscript: 8.0.0 - property-information: 6.4.1 + property-information: 6.5.0 vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 @@ -11763,7 +11759,7 @@ packages: hast-util-whitespace: 3.0.0 not: 0.1.0 nth-check: 2.1.1 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 zwitch: 2.0.4 @@ -11783,7 +11779,7 @@ packages: mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 unist-util-position: 5.0.0 @@ -11792,8 +11788,8 @@ packages: - supports-color dev: false - /hast-util-to-html@9.0.0: - resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + /hast-util-to-html@9.0.1: + resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -11803,9 +11799,9 @@ packages: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.1.0 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 + stringify-entities: 4.0.4 zwitch: 2.0.4 dev: false @@ -11822,7 +11818,7 @@ packages: mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 style-to-object: 1.0.6 unist-util-position: 5.0.0 @@ -11837,7 +11833,7 @@ packages: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -11848,8 +11844,8 @@ packages: dependencies: '@types/hast': 3.0.4 - /hast-util-to-text@4.0.0: - resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + /hast-util-to-text@4.0.1: + resolution: {integrity: sha512-RHL7Vo2n06ZocCFWqmbyhZ1pCYX/mSKdywt9YD5U6Hquu5syV+dImCXFKLFt02JoK5QxkQFS0PoVdFdPXuPffQ==} dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -11868,7 +11864,7 @@ packages: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 /hdr-histogram-js@3.0.0: @@ -12072,7 +12068,6 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - requiresBuild: true dev: false /inline-style-parser@0.1.1: @@ -12120,7 +12115,6 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - requiresBuild: true dev: false /is-bigint@1.0.4: @@ -12773,8 +12767,8 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + /magic-string@0.30.9: + resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -12966,7 +12960,7 @@ packages: mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 - stringify-entities: 4.0.3 + stringify-entities: 4.0.4 unist-util-remove-position: 5.0.0 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -13481,7 +13475,6 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - requiresBuild: true dev: false /min-indent@1.0.1: @@ -13569,7 +13562,6 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - requiresBuild: true dev: false /mkdirp@1.0.4: @@ -13654,8 +13646,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanoid@5.0.6: - resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} + /nanoid@5.0.7: + resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} engines: {node: ^18 || >=20} hasBin: true dev: false @@ -13667,7 +13659,6 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - requiresBuild: true dev: false /natural-compare@1.4.0: @@ -13705,14 +13696,12 @@ packages: /node-abi@3.57.0: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} - requiresBuild: true dependencies: semver: 7.6.0 dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - requiresBuild: true dev: false /node-domexception@1.0.0: @@ -13761,7 +13750,7 @@ packages: engines: {node: '>=14'} dependencies: '@types/express': 4.17.21 - '@types/node': 20.12.2 + '@types/node': 20.12.5 accepts: 1.3.8 content-disposition: 0.5.4 depd: 1.1.2 @@ -13909,8 +13898,8 @@ packages: which-pm-runs: 1.1.0 dev: true - /open-props@1.6.21: - resolution: {integrity: sha512-leK6x7SvLX3K/idbHyFrnwoygaB0YBBMecQ5FJcms/Oqn82b/FIqgMyuLeSqGxpFOwIPdvMirFGpiB74ef+ULg==} + /open-props@1.7.2: + resolution: {integrity: sha512-RheKypVzZBCSZ6c5iJaFWG0OBqdtql3eRFXRYrSNLh6vGzU8NSAHuq9iJPj++DrpPGs1pqlRa2BelwwBHjX3Xg==} dev: false /open@10.1.0: @@ -14161,8 +14150,8 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + /path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} dev: false /path-type@3.0.0: @@ -14548,8 +14537,8 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.5.3(postcss@8.4.38): - resolution: {integrity: sha512-uOBG5kvYMxZGuepbAKr563PCB+syENPa1C9kPA8IvDGraVkrEUk//31oaO06oj9VtuujVtsgXHI7qbQynCuaVQ==} + /postcss-preset-env@9.5.4(postcss@8.4.38): + resolution: {integrity: sha512-o/jOlJjhm4f6rI5q1f+4Og3tz1cjaO50er9ndk7ZdcXHjWOH49kMAhqDC/nQifypQkOAiAmF46dPt3pZM+Cwbg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -14565,7 +14554,7 @@ packages: '@csstools/postcss-ic-unit': 3.0.6(postcss@8.4.38) '@csstools/postcss-initial': 1.0.1(postcss@8.4.38) '@csstools/postcss-is-pseudo-class': 4.0.6(postcss@8.4.38) - '@csstools/postcss-light-dark-function': 1.0.2(postcss@8.4.38) + '@csstools/postcss-light-dark-function': 1.0.3(postcss@8.4.38) '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.38) '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.38) '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.38) @@ -14687,7 +14676,6 @@ packages: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} hasBin: true - requiresBuild: true dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 @@ -14784,8 +14772,8 @@ packages: sisteransi: 1.0.5 dev: false - /property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -14805,7 +14793,6 @@ packages: /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - requiresBuild: true dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -14863,7 +14850,6 @@ packages: /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - requiresBuild: true dependencies: deep-extend: 0.6.0 ini: 1.3.8 @@ -15016,7 +15002,7 @@ packages: '@types/hast': 3.0.4 '@types/mathjax': 0.0.37 hast-util-from-dom: 5.0.0 - hast-util-to-text: 4.0.0 + hast-util-to-text: 4.0.1 jsdom: 22.1.0 mathjax-full: 3.2.2 unified: 11.0.4 @@ -15073,7 +15059,7 @@ packages: resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} dependencies: '@types/hast': 3.0.4 - hast-util-to-html: 9.0.0 + hast-util-to-html: 9.0.1 unified: 11.0.4 dev: false @@ -15291,28 +15277,28 @@ packages: dependencies: glob: 7.2.3 - /rollup@4.13.2: - resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} + /rollup@4.14.1: + resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.2 - '@rollup/rollup-android-arm64': 4.13.2 - '@rollup/rollup-darwin-arm64': 4.13.2 - '@rollup/rollup-darwin-x64': 4.13.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.2 - '@rollup/rollup-linux-arm64-gnu': 4.13.2 - '@rollup/rollup-linux-arm64-musl': 4.13.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.13.2 - '@rollup/rollup-linux-riscv64-gnu': 4.13.2 - '@rollup/rollup-linux-s390x-gnu': 4.13.2 - '@rollup/rollup-linux-x64-gnu': 4.13.2 - '@rollup/rollup-linux-x64-musl': 4.13.2 - '@rollup/rollup-win32-arm64-msvc': 4.13.2 - '@rollup/rollup-win32-ia32-msvc': 4.13.2 - '@rollup/rollup-win32-x64-msvc': 4.13.2 + '@rollup/rollup-android-arm-eabi': 4.14.1 + '@rollup/rollup-android-arm64': 4.14.1 + '@rollup/rollup-darwin-arm64': 4.14.1 + '@rollup/rollup-darwin-x64': 4.14.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 + '@rollup/rollup-linux-arm64-gnu': 4.14.1 + '@rollup/rollup-linux-arm64-musl': 4.14.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 + '@rollup/rollup-linux-riscv64-gnu': 4.14.1 + '@rollup/rollup-linux-s390x-gnu': 4.14.1 + '@rollup/rollup-linux-x64-gnu': 4.14.1 + '@rollup/rollup-linux-x64-musl': 4.14.1 + '@rollup/rollup-win32-arm64-msvc': 4.14.1 + '@rollup/rollup-win32-ia32-msvc': 4.14.1 + '@rollup/rollup-win32-x64-msvc': 4.14.1 fsevents: 2.3.3 /rrweb-cssom@0.6.0: @@ -15363,8 +15349,8 @@ packages: dependencies: suf-log: 2.5.3 - /sass@1.72.0: - resolution: {integrity: sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==} + /sass@1.74.1: + resolution: {integrity: sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -15605,10 +15591,10 @@ packages: vscode-textmate: 5.2.0 dev: true - /shiki@1.2.2: - resolution: {integrity: sha512-nqazfFgrU+DBLqk4+WjmGQz8sVWkcUcGriHqSM2zGk0GhjirVz4FyJ3AABEx91OpjGiKpuKBg2diYfRfQG3Fbg==} + /shiki@1.2.4: + resolution: {integrity: sha512-Q9n9jKiOjJCRPztA9POn3/uZXNySHDNKAsPNpmtHDcFyi6ZQhx5vQKZW3Nhrwn8TWW3RudSRk66zqY603EZDeg==} dependencies: - '@shikijs/core': 1.2.2 + '@shikijs/core': 1.2.4 dev: false /side-channel@1.0.6: @@ -15638,12 +15624,10 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - requiresBuild: true dev: false /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - requiresBuild: true dependencies: decompress-response: 6.0.0 once: 1.4.0 @@ -15667,7 +15651,6 @@ packages: /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - requiresBuild: true dependencies: is-arrayish: 0.3.2 dev: false @@ -15734,7 +15717,7 @@ packages: peerDependencies: solid-js: ^1.3 dependencies: - '@babel/generator': 7.24.1 + '@babel/generator': 7.24.4 '@babel/helper-module-imports': 7.24.3 '@babel/types': 7.24.0 solid-js: 1.8.16 @@ -15833,7 +15816,6 @@ packages: /streamx@2.16.1: resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} - requiresBuild: true dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -15918,8 +15900,8 @@ packages: safe-buffer: 5.2.1 dev: false - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + /stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 @@ -16088,7 +16070,7 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.8 + magic-string: 0.30.9 periscopic: 3.1.0 /svg-tags@1.0.0: @@ -16158,7 +16140,6 @@ packages: /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - requiresBuild: true dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -16168,19 +16149,17 @@ packages: /tar-fs@3.0.5: resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} - requiresBuild: true dependencies: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.2.2 - bare-path: 2.1.0 + bare-fs: 2.2.3 + bare-path: 2.1.1 dev: false /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - requiresBuild: true dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -16191,7 +16170,6 @@ packages: /tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - requiresBuild: true dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 @@ -16391,69 +16369,68 @@ packages: /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - requiresBuild: true dependencies: safe-buffer: 5.2.1 dev: false - /turbo-darwin-64@1.13.0: - resolution: {integrity: sha512-ctHeJXtQgBcgxnCXwrJTGiq57HtwF7zWz5NTuSv//5yeU01BtQIt62ArKfjudOhRefWJbX3Z5srn88XTb9hfww==} + /turbo-darwin-64@1.13.2: + resolution: {integrity: sha512-CCSuD8CfmtncpohCuIgq7eAzUas0IwSbHfI8/Q3vKObTdXyN8vAo01gwqXjDGpzG9bTEVedD0GmLbD23dR0MLA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.13.0: - resolution: {integrity: sha512-/Q9/pNFkF9w83tNxwMpgapwLYdQ12p8mpty2YQRoUiS9ClWkcqe136jR0mtuMqzlNlpREOFZaoyIthjt6Sdo0g==} + /turbo-darwin-arm64@1.13.2: + resolution: {integrity: sha512-0HySm06/D2N91rJJ89FbiI/AodmY8B3WDSFTVEpu2+8spUw7hOJ8okWOT0e5iGlyayUP9gr31eOeL3VFZkpfCw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.13.0: - resolution: {integrity: sha512-hgbT7o020BGV4L7Sd8hhFTd5zVKPKxbsr0dPfel/9NkdTmptz2aGZ0Vb2MAa18SY3XaCQpDxmdYuOzvvRpo5ZA==} + /turbo-linux-64@1.13.2: + resolution: {integrity: sha512-7HnibgbqZrjn4lcfIouzlPu8ZHSBtURG4c7Bedu7WJUDeZo+RE1crlrQm8wuwO54S0siYqUqo7GNHxu4IXbioQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.13.0: - resolution: {integrity: sha512-WK01i2wDZARrV+HEs495A3hNeGMwQR5suYk7G+ceqqW7b+dOTlQdvUjnI3sg7wAnZPgjafFs/hoBaZdJjVa/nw==} + /turbo-linux-arm64@1.13.2: + resolution: {integrity: sha512-sUq4dbpk6SNKg/Hkwn256Vj2AEYSQdG96repio894h5/LEfauIK2QYiC/xxAeW3WBMc6BngmvNyURIg7ltrePg==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.13.0: - resolution: {integrity: sha512-hJgSZJZwlWHNwLEthaqJqJWGm4NqF5X/I7vE0sPE4i/jeDl8f0n1hcOkgJkJiNXVxhj+qy/9+4dzbPLKT9imaQ==} + /turbo-windows-64@1.13.2: + resolution: {integrity: sha512-DqzhcrciWq3dpzllJR2VVIyOhSlXYCo4mNEWl98DJ3FZ08PEzcI3ceudlH6F0t/nIcfSItK1bDP39cs7YoZHEA==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.13.0: - resolution: {integrity: sha512-L/ErxYoXeq8tmjU/AIGicC9VyBN1zdYw8JlM4yPmMI0pJdY8E4GaYK1IiIazqq7M72lmQhU/WW7fV9FqEktwrw==} + /turbo-windows-arm64@1.13.2: + resolution: {integrity: sha512-WnPMrwfCXxK69CdDfS1/j2DlzcKxSmycgDAqV0XCYpK/812KB0KlvsVAt5PjEbZGXkY88pCJ1BLZHAjF5FcbqA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.13.0: - resolution: {integrity: sha512-r02GtNmkOPcQvUzVE6lg474QVLyU02r3yh3lUGqrFHf5h5ZEjgDGWILsAUqplVqjri1Y/oOkTssks4CObTAaiw==} + /turbo@1.13.2: + resolution: {integrity: sha512-rX/d9f4MgRT3yK6cERPAkfavIxbpBZowDQpgvkYwGMGDQ0Nvw1nc0NVjruE76GrzXQqoxR1UpnmEP54vBARFHQ==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.13.0 - turbo-darwin-arm64: 1.13.0 - turbo-linux-64: 1.13.0 - turbo-linux-arm64: 1.13.0 - turbo-windows-64: 1.13.0 - turbo-windows-arm64: 1.13.0 + turbo-darwin-64: 1.13.2 + turbo-darwin-arm64: 1.13.2 + turbo-linux-64: 1.13.2 + turbo-linux-arm64: 1.13.2 + turbo-windows-64: 1.13.2 + turbo-windows-arm64: 1.13.2 dev: true /type-check@0.4.0: @@ -16567,8 +16544,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /typescript@5.4.3: - resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + /typescript@5.4.4: + resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==} engines: {node: '>=14.17'} hasBin: true @@ -16605,8 +16582,8 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici@6.10.2: - resolution: {integrity: sha512-HcVuBy7ACaDejIMdwCzAvO22OsiE6ir6ziTIr9kAE0vB+PheVe29ZvRN8p7FXCO2uZHTjEoUs5bPiFpuc/hwwQ==} + /undici@6.12.0: + resolution: {integrity: sha512-d87yk8lqSFUYtR5fTFe2frpkMIrUEz+lgoJmhcL+J3StVl+8fj8ytE4lLnJOTPCE12YbumNGzf4LYsQyusdV5g==} engines: {node: '>=18.0'} dev: true @@ -16886,7 +16863,7 @@ packages: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - /vite-node@1.4.0(@types/node@18.19.28): + /vite-node@1.4.0(@types/node@18.19.30): resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -16895,7 +16872,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) transitivePeerDependencies: - '@types/node' - less @@ -16919,13 +16896,13 @@ packages: vite: optional: true dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.8.16(@babel/core@7.24.3) + babel-preset-solid: 1.8.16(@babel/core@7.24.4) merge-anything: 5.1.7 solid-js: 1.8.16 solid-refresh: 0.6.3(solid-js@1.8.16) - vitefu: 0.2.5(vite@5.2.7) + vitefu: 0.2.5(vite@5.2.8) transitivePeerDependencies: - supports-color dev: false @@ -16953,8 +16930,8 @@ packages: svgo: 3.2.0 dev: false - /vite@5.2.7(@types/node@18.19.28)(sass@1.72.0): - resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} + /vite@5.2.8(@types/node@18.19.30)(sass@1.74.1): + resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -16981,15 +16958,15 @@ packages: terser: optional: true dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.13.2 - sass: 1.72.0 + rollup: 4.14.1 + sass: 1.74.1 optionalDependencies: fsevents: 2.3.3 - /vitefu@0.2.5(vite@5.2.7): + /vitefu@0.2.5(vite@5.2.8): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -16997,10 +16974,10 @@ packages: vite: optional: true dependencies: - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) dev: false - /vitest@1.4.0(@types/node@18.19.28): + /vitest@1.4.0(@types/node@18.19.30): resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -17025,7 +17002,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 18.19.28 + '@types/node': 18.19.30 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -17036,15 +17013,15 @@ packages: debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.8 + magic-string: 0.30.9 pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.6.0 tinypool: 0.8.3 - vite: 5.2.7(@types/node@18.19.28)(sass@1.72.0) - vite-node: 1.4.0(@types/node@18.19.28) + vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1) + vite-node: 1.4.0(@types/node@18.19.30) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From 4f248e57025338678d27b87e2694b069b911b567 Mon Sep 17 00:00:00 2001 From: horo <143025439+horo-fox@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:19:26 +0900 Subject: [PATCH 22/96] Increase log severity when a page's `getStaticPaths` fails (#10707) --- .changeset/slimy-geese-own.md | 5 +++++ packages/astro/src/core/build/generate.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/slimy-geese-own.md diff --git a/.changeset/slimy-geese-own.md b/.changeset/slimy-geese-own.md new file mode 100644 index 000000000000..6fca5282ba13 --- /dev/null +++ b/.changeset/slimy-geese-own.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Logs an error when a page's `getStaticPaths` fails diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index 7dc00073fc5b..d82ecdbd8daa 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -335,7 +335,7 @@ async function getPathsForRoute( logger, ssr: serverLike, }).catch((err) => { - logger.debug('build', `├── ${bold(red('✗'))} ${route.component}`); + logger.error('build', `Failed to call getStaticPaths for ${route.component}`); throw err; }); From 98acb0f3b6b277054e18c55e8cbdb9bf0d087bc9 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:42:19 -0700 Subject: [PATCH 23/96] [ci] release (#10680) Co-authored-by: github-actions[bot] --- .changeset/few-forks-taste.md | 5 -- .changeset/four-pants-juggle.md | 5 -- .changeset/khaki-turkeys-sip.md | 5 -- .changeset/loud-wasps-pay.md | 5 -- .changeset/old-planes-walk.md | 5 -- .changeset/olive-camels-greet.md | 5 -- .changeset/plenty-bugs-hunt.md | 5 -- .changeset/slimy-geese-own.md | 5 -- .changeset/sour-chairs-compare.md | 5 -- .changeset/tall-wombats-clap.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 2 +- examples/component/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-lit/package.json | 2 +- examples/framework-multiple/package.json | 6 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 4 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 4 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/middleware/package.json | 2 +- examples/minimal/package.json | 2 +- examples/non-html-pages/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/view-transitions/package.json | 2 +- examples/with-markdoc/package.json | 2 +- examples/with-markdown-plugins/package.json | 2 +- examples/with-markdown-shiki/package.json | 2 +- examples/with-mdx/package.json | 2 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 2 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 16 ++++ packages/astro/package.json | 2 +- packages/db/CHANGELOG.md | 8 ++ packages/db/package.json | 2 +- packages/integrations/react/CHANGELOG.md | 6 ++ packages/integrations/react/package.json | 2 +- packages/integrations/vue/CHANGELOG.md | 6 ++ packages/integrations/vue/package.json | 2 +- pnpm-lock.yaml | 94 ++++++++++++++------- 46 files changed, 134 insertions(+), 116 deletions(-) delete mode 100644 .changeset/few-forks-taste.md delete mode 100644 .changeset/four-pants-juggle.md delete mode 100644 .changeset/khaki-turkeys-sip.md delete mode 100644 .changeset/loud-wasps-pay.md delete mode 100644 .changeset/old-planes-walk.md delete mode 100644 .changeset/olive-camels-greet.md delete mode 100644 .changeset/plenty-bugs-hunt.md delete mode 100644 .changeset/slimy-geese-own.md delete mode 100644 .changeset/sour-chairs-compare.md delete mode 100644 .changeset/tall-wombats-clap.md diff --git a/.changeset/few-forks-taste.md b/.changeset/few-forks-taste.md deleted file mode 100644 index fd996361fa78..000000000000 --- a/.changeset/few-forks-taste.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/vue": patch ---- - -Removes unused `jsxTransformOptions` and `jsxImportSource` options from the renderer config diff --git a/.changeset/four-pants-juggle.md b/.changeset/four-pants-juggle.md deleted file mode 100644 index e10cb5019395..000000000000 --- a/.changeset/four-pants-juggle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Marks renderer `jsxImportSource` and `jsxTransformOptions` options as deprecated as they are no longer used since Astro 3.0 diff --git a/.changeset/khaki-turkeys-sip.md b/.changeset/khaki-turkeys-sip.md deleted file mode 100644 index 4bd4096b0006..000000000000 --- a/.changeset/khaki-turkeys-sip.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/db": patch ---- - -Prevent errors in finding workspaceId from interrupting link prompts diff --git a/.changeset/loud-wasps-pay.md b/.changeset/loud-wasps-pay.md deleted file mode 100644 index 60411aa01323..000000000000 --- a/.changeset/loud-wasps-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Improves the color contrast for notification badges on dev toolbar apps diff --git a/.changeset/old-planes-walk.md b/.changeset/old-planes-walk.md deleted file mode 100644 index 46c7da3f4fad..000000000000 --- a/.changeset/old-planes-walk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/db": patch ---- - -Provide better messaging when renaming a table diff --git a/.changeset/olive-camels-greet.md b/.changeset/olive-camels-greet.md deleted file mode 100644 index 6fa4a59c289b..000000000000 --- a/.changeset/olive-camels-greet.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Adds the `disableremoteplayback` attribute to MediaHTMLAttributes interface diff --git a/.changeset/plenty-bugs-hunt.md b/.changeset/plenty-bugs-hunt.md deleted file mode 100644 index 179310ea97b0..000000000000 --- a/.changeset/plenty-bugs-hunt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Skips prerender chunk if building with static output diff --git a/.changeset/slimy-geese-own.md b/.changeset/slimy-geese-own.md deleted file mode 100644 index 6fca5282ba13..000000000000 --- a/.changeset/slimy-geese-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Logs an error when a page's `getStaticPaths` fails diff --git a/.changeset/sour-chairs-compare.md b/.changeset/sour-chairs-compare.md deleted file mode 100644 index f11972309883..000000000000 --- a/.changeset/sour-chairs-compare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Prevents inlining scripts if used by other chunks when using the `experimental.directRenderScript` option diff --git a/.changeset/tall-wombats-clap.md b/.changeset/tall-wombats-clap.md deleted file mode 100644 index 4553ba846e8c..000000000000 --- a/.changeset/tall-wombats-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/react": minor ---- - -Expose Babel config for @astro/react. diff --git a/examples/basics/package.json b/examples/basics/package.json index 85d51849c4cf..1b9fc248a81e 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index 097193639814..25eefaf9184a 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -14,6 +14,6 @@ "@astrojs/mdx": "^2.2.4", "@astrojs/rss": "^4.0.5", "@astrojs/sitemap": "^3.1.2", - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/component/package.json b/examples/component/package.json index 56bd859186f6..48ad487023a8 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.5.16" + "astro": "^4.5.17" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index 26f5961712b5..e009e4ffb389 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -14,6 +14,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.5", "alpinejs": "^3.13.3", - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json index 6723a2a77de5..f9de726c7df6 100644 --- a/examples/framework-lit/package.json +++ b/examples/framework-lit/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/lit": "^4.0.1", "@webcomponents/template-shadowroot": "^0.2.1", - "astro": "^4.5.16", + "astro": "^4.5.17", "lit": "^3.1.2" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index 9e657afaa5fa..9d64ea79604e 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -12,13 +12,13 @@ }, "dependencies": { "@astrojs/preact": "^3.1.2", - "@astrojs/react": "^3.1.1", + "@astrojs/react": "^3.2.0", "@astrojs/solid-js": "^4.0.1", "@astrojs/svelte": "^5.3.0", - "@astrojs/vue": "^4.0.10", + "@astrojs/vue": "^4.0.11", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.5.16", + "astro": "^4.5.17", "preact": "^10.19.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index 267145c0508c..328d98d75924 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.1.2", "@preact/signals": "^1.2.1", - "astro": "^4.5.16", + "astro": "^4.5.17", "preact": "^10.19.2" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index fd8290303ac1..ecd9e44bf41f 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -11,10 +11,10 @@ "astro": "astro" }, "dependencies": { - "@astrojs/react": "^3.1.1", + "@astrojs/react": "^3.2.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.5.16", + "astro": "^4.5.17", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index b1136a1c7b5f..1e855f24d440 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/solid-js": "^4.0.1", - "astro": "^4.5.16", + "astro": "^4.5.17", "solid-js": "^1.8.5" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index 752b7cd5bd86..33c5b4de68f9 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/svelte": "^5.3.0", - "astro": "^4.5.16", + "astro": "^4.5.17", "svelte": "^4.2.5" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index c7910c8f5df4..802648883c98 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -11,8 +11,8 @@ "astro": "astro" }, "dependencies": { - "@astrojs/vue": "^4.0.10", - "astro": "^4.5.16", + "@astrojs/vue": "^4.0.11", + "astro": "^4.5.17", "vue": "^3.3.8" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index 97357d75c59d..007b11ff332d 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index 97e0ab331424..32396390d004 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.5.16" + "astro": "^4.5.17" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/middleware/package.json b/examples/middleware/package.json index ad049aa1af1b..36b466433830 100644 --- a/examples/middleware/package.json +++ b/examples/middleware/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.5.16", + "astro": "^4.5.17", "html-minifier": "^4.0.0" }, "devDependencies": { diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 2c480f31daa7..17a16c878d93 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json index fa446fa481a1..c3d1b7bd9dfb 100644 --- a/examples/non-html-pages/package.json +++ b/examples/non-html-pages/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index 07f8c3166320..020a626e2864 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index 4bef31b2aad2..ee80e0fac0c8 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -14,7 +14,7 @@ "dependencies": { "@astrojs/node": "^8.2.5", "@astrojs/svelte": "^5.3.0", - "astro": "^4.5.16", + "astro": "^4.5.17", "svelte": "^4.2.5" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index e6e5607bed24..c4c85737d0de 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.16", + "astro": "^4.5.17", "sass": "^1.69.5", "sharp": "^0.32.6" } diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json index 6fc736818d34..2c00d468ee5a 100644 --- a/examples/view-transitions/package.json +++ b/examples/view-transitions/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@astrojs/tailwind": "^5.1.0", "@astrojs/node": "^8.2.5", - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index b5b96d87afef..61b394501faa 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/markdoc": "^0.9.5", - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json index 41661a7120da..5ce3fbdb3400 100644 --- a/examples/with-markdown-plugins/package.json +++ b/examples/with-markdown-plugins/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/markdown-remark": "^5.0.0", - "astro": "^4.5.16", + "astro": "^4.5.17", "hast-util-select": "^6.0.2", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json index 091ee095fe45..464f639cb6ed 100644 --- a/examples/with-markdown-shiki/package.json +++ b/examples/with-markdown-shiki/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.16" + "astro": "^4.5.17" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index 5e33fb48f749..0f5005cf01c3 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/mdx": "^2.2.4", "@astrojs/preact": "^3.1.2", - "astro": "^4.5.16", + "astro": "^4.5.17", "preact": "^10.19.2" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index 461e871189b4..208ba5244955 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.1.2", "@nanostores/preact": "^0.5.0", - "astro": "^4.5.16", + "astro": "^4.5.17", "nanostores": "^0.9.5", "preact": "^10.19.2" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index a696f8e77b8a..295b89a70b8f 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -14,7 +14,7 @@ "@astrojs/mdx": "^2.2.4", "@astrojs/tailwind": "^5.1.0", "@types/canvas-confetti": "^1.6.3", - "astro": "^4.5.16", + "astro": "^4.5.17", "autoprefixer": "^10.4.15", "canvas-confetti": "^1.9.1", "postcss": "^8.4.28", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 8457b783bea4..30ecf6968c88 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -12,7 +12,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^4.5.16", + "astro": "^4.5.17", "vitest": "^1.3.1" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 3f6bdb6a71ee..5b835d97474d 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,21 @@ # astro +## 4.5.17 + +### Patch Changes + +- [#10688](https://github.com/withastro/astro/pull/10688) [`799f6f3f29a3ef4f76347870a209ffa89651adfa`](https://github.com/withastro/astro/commit/799f6f3f29a3ef4f76347870a209ffa89651adfa) Thanks [@bluwy](https://github.com/bluwy)! - Marks renderer `jsxImportSource` and `jsxTransformOptions` options as deprecated as they are no longer used since Astro 3.0 + +- [#10657](https://github.com/withastro/astro/pull/10657) [`93d353528fa1a85b67e3f1e9514ed2a1b42dfd94`](https://github.com/withastro/astro/commit/93d353528fa1a85b67e3f1e9514ed2a1b42dfd94) Thanks [@natemoo-re](https://github.com/natemoo-re)! - Improves the color contrast for notification badges on dev toolbar apps + +- [#10693](https://github.com/withastro/astro/pull/10693) [`1d26e9c7f7d8f47e33bc68d3b30bbffce25c7b63`](https://github.com/withastro/astro/commit/1d26e9c7f7d8f47e33bc68d3b30bbffce25c7b63) Thanks [@apetta](https://github.com/apetta)! - Adds the `disableremoteplayback` attribute to MediaHTMLAttributes interface + +- [#10695](https://github.com/withastro/astro/pull/10695) [`a15975e41cb5eaf6ed8eb3ebaee676a17e433052`](https://github.com/withastro/astro/commit/a15975e41cb5eaf6ed8eb3ebaee676a17e433052) Thanks [@bluwy](https://github.com/bluwy)! - Skips prerender chunk if building with static output + +- [#10707](https://github.com/withastro/astro/pull/10707) [`5e044a5eafaa206d2ef8b62c37d1bcd37f0a4078`](https://github.com/withastro/astro/commit/5e044a5eafaa206d2ef8b62c37d1bcd37f0a4078) Thanks [@horo-fox](https://github.com/horo-fox)! - Logs an error when a page's `getStaticPaths` fails + +- [#10686](https://github.com/withastro/astro/pull/10686) [`fa0f593890502faf5709ab881fe0e45519d2f7af`](https://github.com/withastro/astro/commit/fa0f593890502faf5709ab881fe0e45519d2f7af) Thanks [@bluwy](https://github.com/bluwy)! - Prevents inlining scripts if used by other chunks when using the `experimental.directRenderScript` option + ## 4.5.16 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index d9ccc419e717..b876f8e45b38 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "4.5.16", + "version": "4.5.17", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md index a6e2a3b81ab2..75ad8dd37fdf 100644 --- a/packages/db/CHANGELOG.md +++ b/packages/db/CHANGELOG.md @@ -1,5 +1,13 @@ # @astrojs/db +## 0.10.2 + +### Patch Changes + +- [#10681](https://github.com/withastro/astro/pull/10681) [`4bf8bd3848a6f3461f0186854588a8e2f90f4dbc`](https://github.com/withastro/astro/commit/4bf8bd3848a6f3461f0186854588a8e2f90f4dbc) Thanks [@matthewp](https://github.com/matthewp)! - Prevent errors in finding workspaceId from interrupting link prompts + +- [#10600](https://github.com/withastro/astro/pull/10600) [`28e7535e5c7a8234049bd187cac88c7fabf15f9c`](https://github.com/withastro/astro/commit/28e7535e5c7a8234049bd187cac88c7fabf15f9c) Thanks [@matthewp](https://github.com/matthewp)! - Provide better messaging when renaming a table + ## 0.10.1 ### Patch Changes diff --git a/packages/db/package.json b/packages/db/package.json index ebe67650953d..7f70ddc23694 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/db", - "version": "0.10.1", + "version": "0.10.2", "description": "", "license": "MIT", "type": "module", diff --git a/packages/integrations/react/CHANGELOG.md b/packages/integrations/react/CHANGELOG.md index 534a314b5669..97d33dad7876 100644 --- a/packages/integrations/react/CHANGELOG.md +++ b/packages/integrations/react/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/react +## 3.2.0 + +### Minor Changes + +- [#10675](https://github.com/withastro/astro/pull/10675) [`14f1d49a10541fecc4c10def8a094322442ccf23`](https://github.com/withastro/astro/commit/14f1d49a10541fecc4c10def8a094322442ccf23) Thanks [@fightingcat](https://github.com/fightingcat)! - Expose Babel config for @astro/react. + ## 3.1.1 ### Patch Changes diff --git a/packages/integrations/react/package.json b/packages/integrations/react/package.json index 574740d991fe..87a104de5835 100644 --- a/packages/integrations/react/package.json +++ b/packages/integrations/react/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/react", "description": "Use React components within Astro", - "version": "3.1.1", + "version": "3.2.0", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/vue/CHANGELOG.md b/packages/integrations/vue/CHANGELOG.md index 63cc8aebea65..8d050d16a5ef 100644 --- a/packages/integrations/vue/CHANGELOG.md +++ b/packages/integrations/vue/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/vue +## 4.0.11 + +### Patch Changes + +- [#10687](https://github.com/withastro/astro/pull/10687) [`4ea042c38839783fb42e8261d89d7c7149892518`](https://github.com/withastro/astro/commit/4ea042c38839783fb42e8261d89d7c7149892518) Thanks [@bluwy](https://github.com/bluwy)! - Removes unused `jsxTransformOptions` and `jsxImportSource` options from the renderer config + ## 4.0.10 ### Patch Changes diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json index 4cacb25332e5..28f3655efc59 100644 --- a/packages/integrations/vue/package.json +++ b/packages/integrations/vue/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/vue", - "version": "4.0.10", + "version": "4.0.11", "description": "Use Vue components within Astro", "type": "module", "types": "./dist/index.d.ts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4833b5fe9eab..79168e0c0349 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,7 +134,7 @@ importers: examples/basics: dependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/blog: @@ -149,13 +149,13 @@ importers: specifier: ^3.1.2 version: link:../../packages/integrations/sitemap astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/framework-alpine: @@ -170,7 +170,7 @@ importers: specifier: ^3.13.3 version: 3.13.8 astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/framework-lit: @@ -182,7 +182,7 @@ importers: specifier: ^0.2.1 version: 0.2.1 astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro lit: specifier: ^3.1.2 @@ -194,7 +194,7 @@ importers: specifier: ^3.1.2 version: link:../../packages/integrations/preact '@astrojs/react': - specifier: ^3.1.1 + specifier: ^3.2.0 version: link:../../packages/integrations/react '@astrojs/solid-js': specifier: ^4.0.1 @@ -203,7 +203,7 @@ importers: specifier: ^5.3.0 version: link:../../packages/integrations/svelte '@astrojs/vue': - specifier: ^4.0.10 + specifier: ^4.0.11 version: link:../../packages/integrations/vue '@types/react': specifier: ^18.2.37 @@ -212,7 +212,7 @@ importers: specifier: ^18.2.15 version: 18.2.24 astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -242,7 +242,7 @@ importers: specifier: ^1.2.1 version: 1.2.1(preact@10.20.1) astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -251,7 +251,7 @@ importers: examples/framework-react: dependencies: '@astrojs/react': - specifier: ^3.1.1 + specifier: ^3.2.0 version: link:../../packages/integrations/react '@types/react': specifier: ^18.2.37 @@ -260,7 +260,7 @@ importers: specifier: ^18.2.15 version: 18.2.24 astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro react: specifier: ^18.2.0 @@ -275,7 +275,7 @@ importers: specifier: ^4.0.1 version: link:../../packages/integrations/solid astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro solid-js: specifier: ^1.8.5 @@ -287,7 +287,7 @@ importers: specifier: ^5.3.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -296,10 +296,10 @@ importers: examples/framework-vue: dependencies: '@astrojs/vue': - specifier: ^4.0.10 + specifier: ^4.0.11 version: link:../../packages/integrations/vue astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro vue: specifier: ^3.3.8 @@ -311,13 +311,13 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/middleware: @@ -326,7 +326,7 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro html-minifier: specifier: ^4.0.0 @@ -339,19 +339,19 @@ importers: examples/minimal: dependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/non-html-pages: dependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/ssr: @@ -363,7 +363,7 @@ importers: specifier: ^5.3.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -372,7 +372,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro sass: specifier: ^1.69.5 @@ -390,7 +390,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/integrations/tailwind astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/with-markdoc: @@ -399,7 +399,7 @@ importers: specifier: ^0.9.5 version: link:../../packages/integrations/markdoc astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/with-markdown-plugins: @@ -408,7 +408,7 @@ importers: specifier: ^5.0.0 version: link:../../packages/markdown/remark astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro hast-util-select: specifier: ^6.0.2 @@ -429,7 +429,7 @@ importers: examples/with-markdown-shiki: dependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro examples/with-mdx: @@ -441,7 +441,7 @@ importers: specifier: ^3.1.2 version: link:../../packages/integrations/preact astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -456,7 +456,7 @@ importers: specifier: ^0.5.0 version: 0.5.1(nanostores@0.9.5)(preact@10.20.1) astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro nanostores: specifier: ^0.9.5 @@ -477,7 +477,7 @@ importers: specifier: ^1.6.3 version: 1.6.4 astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro autoprefixer: specifier: ^10.4.15 @@ -495,7 +495,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^4.5.16 + specifier: ^4.5.17 version: link:../../packages/astro vitest: specifier: ^1.3.1 @@ -9418,6 +9418,7 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + requiresBuild: true dev: false /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.4): @@ -9528,6 +9529,7 @@ packages: /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + requiresBuild: true dependencies: buffer: 5.7.1 inherits: 2.0.4 @@ -9819,6 +9821,7 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + requiresBuild: true dev: false /chownr@2.0.0: @@ -9943,9 +9946,11 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + requiresBuild: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + requiresBuild: true dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 @@ -9959,6 +9964,7 @@ packages: /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + requiresBuild: true dependencies: color-convert: 2.0.1 color-string: 1.9.1 @@ -10293,6 +10299,7 @@ packages: /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + requiresBuild: true dependencies: mimic-response: 3.1.0 dev: false @@ -10314,6 +10321,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + requiresBuild: true dev: false /deep-is@0.1.4: @@ -10649,6 +10657,7 @@ packages: /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + requiresBuild: true dependencies: once: 1.4.0 dev: false @@ -11095,6 +11104,7 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + requiresBuild: true dev: false /express@4.19.2: @@ -11169,6 +11179,7 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + requiresBuild: true dev: false /fast-glob@3.3.2: @@ -11331,6 +11342,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + requiresBuild: true dev: false /fs-extra@10.1.0: @@ -11484,6 +11496,7 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + requiresBuild: true dev: false /github-slugger@2.0.0: @@ -12068,6 +12081,7 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + requiresBuild: true dev: false /inline-style-parser@0.1.1: @@ -12115,6 +12129,7 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + requiresBuild: true dev: false /is-bigint@1.0.4: @@ -13475,6 +13490,7 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + requiresBuild: true dev: false /min-indent@1.0.1: @@ -13562,6 +13578,7 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + requiresBuild: true dev: false /mkdirp@1.0.4: @@ -13659,6 +13676,7 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + requiresBuild: true dev: false /natural-compare@1.4.0: @@ -13696,12 +13714,14 @@ packages: /node-abi@3.57.0: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} + requiresBuild: true dependencies: semver: 7.6.0 dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + requiresBuild: true dev: false /node-domexception@1.0.0: @@ -14676,6 +14696,7 @@ packages: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} hasBin: true + requiresBuild: true dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 @@ -14793,6 +14814,7 @@ packages: /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + requiresBuild: true dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -14850,6 +14872,7 @@ packages: /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + requiresBuild: true dependencies: deep-extend: 0.6.0 ini: 1.3.8 @@ -15624,10 +15647,12 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true dev: false /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + requiresBuild: true dependencies: decompress-response: 6.0.0 once: 1.4.0 @@ -15651,6 +15676,7 @@ packages: /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + requiresBuild: true dependencies: is-arrayish: 0.3.2 dev: false @@ -15816,6 +15842,7 @@ packages: /streamx@2.16.1: resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + requiresBuild: true dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -16140,6 +16167,7 @@ packages: /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + requiresBuild: true dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -16149,6 +16177,7 @@ packages: /tar-fs@3.0.5: resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + requiresBuild: true dependencies: pump: 3.0.0 tar-stream: 3.1.7 @@ -16160,6 +16189,7 @@ packages: /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + requiresBuild: true dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -16170,6 +16200,7 @@ packages: /tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + requiresBuild: true dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 @@ -16369,6 +16400,7 @@ packages: /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 dev: false From bc115f90b0685f4e18bc4666056d793d076c9217 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Tue, 9 Apr 2024 06:26:15 -0400 Subject: [PATCH 24/96] fix: use just pnpm to run the build and tests in citgm (#10727) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1f33076d5319..0222a1a302b6 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "release": "pnpm run build && changeset publish", "build": "turbo run build --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "build:ci": "turbo run build:ci --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", - "build:ci:no-cache": "pnpm build:ci --force", + "build:ci:no-cache": "pnpm -r --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\" build:ci", "build:examples": "turbo run build --filter=\"@example/*\"", "dev": "turbo run dev --concurrency=40 --parallel --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "format": "pnpm run format:code && pnpm run format:imports", @@ -21,7 +21,7 @@ "format:imports": "biome check --apply .", "format:imports:ci": "biome ci .", "test": "turbo run test --concurrency=1 --filter=astro --filter=create-astro --filter=\"@astrojs/*\"", - "test:citgm": "pnpm run test --force", + "test:citgm": "pnpm -r --filter=astro test", "test:match": "cd packages/astro && pnpm run test:match", "test:unit": "cd packages/astro && pnpm run test:unit", "test:unit:match": "cd packages/astro && pnpm run test:unit:match", From 945ad5cdd7d673f456a9f6c1bcdb88bdb7499126 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 9 Apr 2024 12:36:48 +0100 Subject: [PATCH 25/96] fix(devtool): do not trigger interaction check for `div` and `span` (#10719) * fix(devtool): do not trigger interaction check for `div` and `span` * add test * add tests * Rephrase changeset * remove log * add reference link * Update .changeset/swift-coats-teach.md Co-authored-by: Florian Lefebvre --------- Co-authored-by: Florian Lefebvre --- .changeset/swift-coats-teach.md | 12 ++++++++++++ .../dev-toolbar/src/pages/a11y-exceptions.astro | 2 ++ .../client/dev-toolbar/apps/audit/rules/a11y.ts | 6 ++++++ 3 files changed, 20 insertions(+) create mode 100644 .changeset/swift-coats-teach.md diff --git a/.changeset/swift-coats-teach.md b/.changeset/swift-coats-teach.md new file mode 100644 index 000000000000..52d7836a9123 --- /dev/null +++ b/.changeset/swift-coats-teach.md @@ -0,0 +1,12 @@ +--- +"astro": patch +--- + +Fixes a false positive for `div` and `span` elements when running the Dev Toolbar accessibility audits. + +Those are special elements that don't have an interaction assigned by default. Instead, it is assigned through the `role` attribute. This means that cases like the following are now deemed correct: + +```html +
+ +``` diff --git a/packages/astro/e2e/fixtures/dev-toolbar/src/pages/a11y-exceptions.astro b/packages/astro/e2e/fixtures/dev-toolbar/src/pages/a11y-exceptions.astro index 0da2c272d363..9aa8166dbac7 100644 --- a/packages/astro/e2e/fixtures/dev-toolbar/src/pages/a11y-exceptions.astro +++ b/packages/astro/e2e/fixtures/dev-toolbar/src/pages/a11y-exceptions.astro @@ -4,3 +4,5 @@ +
+ diff --git a/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts b/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts index ca5fa298e49c..27da9b011e0d 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts @@ -107,6 +107,10 @@ const aria_non_interactive_roles = [ 'tooltip', ]; +// These elements aren't interactive and aren't non-interactive. Their interaction changes based on the role assigned to them +// https://www.w3.org/TR/html-aria/#docconformance -> look at the table, specification for the `div` and `span` elements. +const roleless_elements = ['div', 'span']; + const a11y_required_content = [ // anchor-has-content 'a', @@ -467,6 +471,7 @@ export const a11y: AuditRuleWithSelector[] = [ const role = element.getAttribute('role'); if (!role) return false; if (!ariaRoles.has(role)) return false; + if (roleless_elements.includes(element.localName)) return false; if (aria_non_interactive_roles.includes(role)) return true; }, @@ -487,6 +492,7 @@ export const a11y: AuditRuleWithSelector[] = [ element.localName as keyof typeof a11y_non_interactive_element_to_interactive_role_exceptions ]; if (exceptions?.includes(role)) return false; + if (roleless_elements.includes(element.localName)) return false; if (!aria_non_interactive_roles.includes(role)) return true; }, From 371583542244f405834a49e7b616fb5c157ee91d Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 9 Apr 2024 12:37:06 +0100 Subject: [PATCH 26/96] fix: regression for astro attributes escaping (#10728) --- .changeset/large-knives-confess.md | 5 +++++ packages/astro/src/runtime/server/render/util.ts | 9 +++++---- packages/astro/test/astro-attrs.test.js | 6 ++++++ .../test/fixtures/astro-attrs/src/pages/index.astro | 3 ++- 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 .changeset/large-knives-confess.md diff --git a/.changeset/large-knives-confess.md b/.changeset/large-knives-confess.md new file mode 100644 index 000000000000..364054ce3793 --- /dev/null +++ b/.changeset/large-knives-confess.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes a regression where some very **specific** code rendered using `expressive-code` was not escaped properly. diff --git a/packages/astro/src/runtime/server/render/util.ts b/packages/astro/src/runtime/server/render/util.ts index 5e1fff9fc0ea..39414591f58f 100644 --- a/packages/astro/src/runtime/server/render/util.ts +++ b/packages/astro/src/runtime/server/render/util.ts @@ -105,7 +105,7 @@ Make sure to use the static attribute syntax (\`${key}={value}\`) instead of the } // Prevents URLs in attributes from being escaped in static builds - if (typeof value === 'string' && value.includes('&') && urlCanParse(value)) { + if (typeof value === 'string' && value.includes('&') && isHttpUrl(value)) { return markHTMLString(` ${key}="${toAttributeString(value, false)}"`); } @@ -247,10 +247,11 @@ export function promiseWithResolvers(): PromiseWithResolvers { }; } -function urlCanParse(url: string) { +const VALID_PROTOCOLS = ['http:', 'https:']; +function isHttpUrl(url: string) { try { - new URL(url); - return true; + const parsedUrl = new URL(url); + return VALID_PROTOCOLS.includes(parsedUrl.protocol); } catch { return false; } diff --git a/packages/astro/test/astro-attrs.test.js b/packages/astro/test/astro-attrs.test.js index b307a3f39707..f4a0140427a5 100644 --- a/packages/astro/test/astro-attrs.test.js +++ b/packages/astro/test/astro-attrs.test.js @@ -37,6 +37,12 @@ describe('Attributes', async () => { true ); + // cheerio will unescape the values, so checking that the url rendered unescaped to begin with has to be done manually + assert.equal( + html.includes('cmd: echo "foo" && echo "bar" > /tmp/hello.txt'), + true + ); + for (const id of Object.keys(attrs)) { const { attribute, value } = attrs[id]; const attr = $(`#${id}`).attr(attribute); diff --git a/packages/astro/test/fixtures/astro-attrs/src/pages/index.astro b/packages/astro/test/fixtures/astro-attrs/src/pages/index.astro index b7e617e365d2..7ac96635fd14 100644 --- a/packages/astro/test/fixtures/astro-attrs/src/pages/index.astro +++ b/packages/astro/test/fixtures/astro-attrs/src/pages/index.astro @@ -6,6 +6,7 @@ + /tmp/hello.txt"} /> - \ No newline at end of file + From c0c1f7443f16892fd6b9fe5f3f1bee06a5175b22 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 9 Apr 2024 09:11:32 -0400 Subject: [PATCH 27/96] Fix db seeding when srcDir is root (#10720) --- .changeset/spotty-hounds-ring.md | 5 +++ .../db/src/core/integration/vite-plugin-db.ts | 3 +- packages/db/test/db-in-src.test.js | 37 +++++++++++++++++++ .../test/fixtures/db-in-src/astro.config.ts | 10 +++++ .../db/test/fixtures/db-in-src/db/config.ts | 13 +++++++ .../db/test/fixtures/db-in-src/db/seed.ts | 8 ++++ .../db/test/fixtures/db-in-src/package.json | 14 +++++++ .../test/fixtures/db-in-src/pages/index.astro | 11 ++++++ pnpm-lock.yaml | 9 +++++ 9 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 .changeset/spotty-hounds-ring.md create mode 100644 packages/db/test/db-in-src.test.js create mode 100644 packages/db/test/fixtures/db-in-src/astro.config.ts create mode 100644 packages/db/test/fixtures/db-in-src/db/config.ts create mode 100644 packages/db/test/fixtures/db-in-src/db/seed.ts create mode 100644 packages/db/test/fixtures/db-in-src/package.json create mode 100644 packages/db/test/fixtures/db-in-src/pages/index.astro diff --git a/.changeset/spotty-hounds-ring.md b/.changeset/spotty-hounds-ring.md new file mode 100644 index 000000000000..b423a2ade3d4 --- /dev/null +++ b/.changeset/spotty-hounds-ring.md @@ -0,0 +1,5 @@ +--- +"@astrojs/db": patch +--- + +Fix db seeding when srcDir is root diff --git a/packages/db/src/core/integration/vite-plugin-db.ts b/packages/db/src/core/integration/vite-plugin-db.ts index f1dc3ea7b015..df31d527673b 100644 --- a/packages/db/src/core/integration/vite-plugin-db.ts +++ b/packages/db/src/core/integration/vite-plugin-db.ts @@ -40,6 +40,7 @@ type VitePluginDBParams = export function vitePluginDb(params: VitePluginDBParams): VitePlugin { const srcDirPath = normalizePath(fileURLToPath(params.srcDir)); + const dbDirPath = normalizePath(fileURLToPath(getDbDirectoryUrl(params.root))); let command: 'build' | 'serve' = 'build'; return { name: 'astro:db', @@ -54,7 +55,7 @@ export function vitePluginDb(params: VitePluginDBParams): VitePlugin { const importer = rawImporter ? await this.resolve(rawImporter) : null; if (!importer) return resolved.virtual; - if (importer.id.startsWith(srcDirPath)) { + if (importer.id.startsWith(srcDirPath) && !importer.id.startsWith(dbDirPath)) { // Seed only if the importer is in the src directory. // Otherwise, we may get recursive seed calls (ex. import from db/seed.ts). return resolved.seedVirtual; diff --git a/packages/db/test/db-in-src.test.js b/packages/db/test/db-in-src.test.js new file mode 100644 index 000000000000..460438001f32 --- /dev/null +++ b/packages/db/test/db-in-src.test.js @@ -0,0 +1,37 @@ +import { expect } from 'chai'; +import { load as cheerioLoad } from 'cheerio'; +import testAdapter from '../../astro/test/test-adapter.js'; +import { loadFixture } from '../../astro/test/test-utils.js'; + +describe('astro:db', () => { + let fixture; + before(async () => { + fixture = await loadFixture({ + root: new URL('./fixtures/db-in-src/', import.meta.url), + output: 'server', + srcDir: '.', + adapter: testAdapter(), + }); + }); + + describe('development: db/ folder inside srcDir', () => { + let devServer; + + before(async () => { + devServer = await fixture.startDevServer(); + }); + + after(async () => { + await devServer.stop(); + }); + + it('Prints the list of authors', async () => { + const html = await fixture.fetch('/').then((res) => res.text()); + const $ = cheerioLoad(html); + + const ul = $('.users-list'); + expect(ul.children()).to.have.a.lengthOf(1); + expect($('.users-list li').text()).to.equal('Mario'); + }); + }); +}); diff --git a/packages/db/test/fixtures/db-in-src/astro.config.ts b/packages/db/test/fixtures/db-in-src/astro.config.ts new file mode 100644 index 000000000000..983a6947d115 --- /dev/null +++ b/packages/db/test/fixtures/db-in-src/astro.config.ts @@ -0,0 +1,10 @@ +import db from '@astrojs/db'; +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({ + integrations: [db()], + devToolbar: { + enabled: false, + }, +}); diff --git a/packages/db/test/fixtures/db-in-src/db/config.ts b/packages/db/test/fixtures/db-in-src/db/config.ts new file mode 100644 index 000000000000..44c15abe7567 --- /dev/null +++ b/packages/db/test/fixtures/db-in-src/db/config.ts @@ -0,0 +1,13 @@ +import { column, defineDb, defineTable } from 'astro:db'; + +const User = defineTable({ + columns: { + id: column.text({ primaryKey: true, optional: false }), + username: column.text({ optional: false, unique: true }), + password: column.text({ optional: false }), + }, +}); + +export default defineDb({ + tables: { User }, +}); diff --git a/packages/db/test/fixtures/db-in-src/db/seed.ts b/packages/db/test/fixtures/db-in-src/db/seed.ts new file mode 100644 index 000000000000..7ff9f5f30dc8 --- /dev/null +++ b/packages/db/test/fixtures/db-in-src/db/seed.ts @@ -0,0 +1,8 @@ +import { asDrizzleTable } from '@astrojs/db/utils'; +import { User, db } from 'astro:db'; + +export default async function () { + await db.batch([ + db.insert(User).values([{ id: 'mario', username: 'Mario', password: 'itsame' }]), + ]); +} diff --git a/packages/db/test/fixtures/db-in-src/package.json b/packages/db/test/fixtures/db-in-src/package.json new file mode 100644 index 000000000000..a1580d1cb1cf --- /dev/null +++ b/packages/db/test/fixtures/db-in-src/package.json @@ -0,0 +1,14 @@ +{ + "name": "@test/db-db-in-src", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview" + }, + "dependencies": { + "@astrojs/db": "workspace:*", + "astro": "workspace:*" + } +} diff --git a/packages/db/test/fixtures/db-in-src/pages/index.astro b/packages/db/test/fixtures/db-in-src/pages/index.astro new file mode 100644 index 000000000000..90f6381150e5 --- /dev/null +++ b/packages/db/test/fixtures/db-in-src/pages/index.astro @@ -0,0 +1,11 @@ +--- +/// +import { db, User } from 'astro:db'; + +const users = await db.select().from(User); +--- + +

Users

+
    + {users.map((user) =>
  • {user.username}
  • )} +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79168e0c0349..1fe401c54a44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3933,6 +3933,15 @@ importers: specifier: workspace:* version: link:../../../../astro + packages/db/test/fixtures/db-in-src: + dependencies: + '@astrojs/db': + specifier: workspace:* + version: link:../../.. + astro: + specifier: workspace:* + version: link:../../../../astro + packages/db/test/fixtures/error-handling: dependencies: '@astrojs/db': From 4dd37e22dd9796f500c197ff94e899d05dcbb0c3 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 9 Apr 2024 15:55:07 +0100 Subject: [PATCH 28/96] ci: add ref when checking out the repository (#10733) --- .github/workflows/check-merge.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/check-merge.yml b/.github/workflows/check-merge.yml index a40a3b8714bd..8a2b3243b780 100644 --- a/.github/workflows/check-merge.yml +++ b/.github/workflows/check-merge.yml @@ -36,6 +36,7 @@ jobs: if: steps.blocked.outputs.result != 'true' with: repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - name: Get changed files in the .changeset folder From b15ae1896c891de13a98b9b1fd7632623cda68c3 Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Wed, 10 Apr 2024 06:25:33 +0530 Subject: [PATCH 29/96] fix(dev): break implicit rerouting loop (#10737) * fix(dev): infinite implicit rerouting * test adapter * changeset --- .changeset/sharp-elephants-clap.md | 5 + .../src/vite-plugin-astro-server/route.ts | 2 +- .../custom-404-implicit-rerouting.test.js | 96 +++++++++---------- .../src/pages/index.astro | 1 + 4 files changed, 54 insertions(+), 50 deletions(-) create mode 100644 .changeset/sharp-elephants-clap.md create mode 100644 packages/astro/test/fixtures/custom-404-loop-case-5/src/pages/index.astro diff --git a/.changeset/sharp-elephants-clap.md b/.changeset/sharp-elephants-clap.md new file mode 100644 index 000000000000..b1bf39bfa308 --- /dev/null +++ b/.changeset/sharp-elephants-clap.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes a regression where constructing and returning 404 responses from a middleware resulted in the dev server getting stuck in a loop. diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index c793151a445a..3228641489fb 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -287,7 +287,7 @@ export async function handleRoute({ } if (response.status === 404 && response.headers.get(REROUTE_DIRECTIVE_HEADER) !== 'no') { const fourOhFourRoute = await matchRoute('/404', manifestData, pipeline); - if (options) + if (options && options.route !== fourOhFourRoute?.route) return handleRoute({ ...options, matchedRoute: fourOhFourRoute, diff --git a/packages/astro/test/custom-404-implicit-rerouting.test.js b/packages/astro/test/custom-404-implicit-rerouting.test.js index 4986b34c42ba..5dcda1329d89 100644 --- a/packages/astro/test/custom-404-implicit-rerouting.test.js +++ b/packages/astro/test/custom-404-implicit-rerouting.test.js @@ -1,69 +1,67 @@ import assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; import { loadFixture } from './test-utils.js'; +import testAdapter from './test-adapter.js'; -for (const caseNumber of [1, 2, 3, 4]) { +for (const caseNumber of [1, 2, 3, 4, 5]) { describe(`Custom 404 with implicit rerouting - Case #${caseNumber}`, () => { - /** @type Awaited> */ + /** @type {import('./test-utils.js').Fixture} */ let fixture; - /** @type Awaited> */ - let devServer; before(async () => { fixture = await loadFixture({ + output: 'server', root: `./fixtures/custom-404-loop-case-${caseNumber}/`, site: 'http://example.com', + adapter: testAdapter() }); - - devServer = await fixture.startDevServer(); }); - // sanity check - it.skip( - 'dev server handles normal requests', - { - todo: 'To re-enabled after we understand why this fails when the test suite is run in parallel', - }, - async () => { - const resPromise = fixture.fetch('/'); - const result = await withTimeout(resPromise, 1000); - assert.notEqual(result, timeout); - assert.equal(result.status, 200); - } - ); + describe("dev server", () => { + /** @type {import('./test-utils.js').DevServer} */ + let devServer; - it.skip( - 'dev server stays responsive', - { - todo: 'To re-enabled after we understand why this fails when the test suite is run in parallel', - }, - async () => { - const resPromise = fixture.fetch('/alvsibdlvjks'); - const result = await withTimeout(resPromise, 1000); - assert.notEqual(result, timeout); - assert.equal(result.status, 404); - } - ); + before(async () => { + await fixture.build() + devServer = await fixture.startDevServer(); + }); - after(async () => { - await devServer.stop(); + // sanity check + it('dev server handles normal requests', { timeout: 1000 }, async () => { + const response = await fixture.fetch('/'); + assert.equal(response.status, 200); + }); + + // IMPORTANT: never skip + it('dev server stays responsive', { timeout: 1000 }, async () => { + const response = await fixture.fetch('/alvsibdlvjks'); + assert.equal(response.status, 404); + }); + + after(async () => { + await devServer.stop(); + }); }); - }); -} + + describe("prod server", () => { + /** @type {import('./test-utils.js').App} */ + let app; -/***** UTILITY FUNCTIONS *****/ - -const timeout = Symbol('timeout'); - -/** @template Res */ -function withTimeout( - /** @type Promise */ - responsePromise, - /** @type number */ - timeLimit -) { - /** @type Promise */ - const timeoutPromise = new Promise((resolve) => setTimeout(() => resolve(timeout), timeLimit)); + before(async () => { + app = await fixture.loadTestAdapterApp(); + }); - return Promise.race([responsePromise, timeoutPromise]); + // sanity check + it('prod server handles normal requests', { timeout: 1000 }, async () => { + const response = await app.render(new Request('https://example.com/')); + assert.equal(response.status, 200); + }); + + // IMPORTANT: never skip + it('prod server stays responsive', { timeout: 1000 }, async () => { + const response = await app.render(new Request('https://example.com/alvsibdlvjks')); + assert.equal(response.status, 404); + }); + }); + }); } diff --git a/packages/astro/test/fixtures/custom-404-loop-case-5/src/pages/index.astro b/packages/astro/test/fixtures/custom-404-loop-case-5/src/pages/index.astro new file mode 100644 index 000000000000..a65c81fdb2f1 --- /dev/null +++ b/packages/astro/test/fixtures/custom-404-loop-case-5/src/pages/index.astro @@ -0,0 +1 @@ +

all good here... or is it?

\ No newline at end of file From 576d192010f04787d046e45220ec0e56ffd15549 Mon Sep 17 00:00:00 2001 From: Arsh Date: Wed, 10 Apr 2024 00:56:41 +0000 Subject: [PATCH 30/96] [ci] format --- .../test/custom-404-implicit-rerouting.test.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/astro/test/custom-404-implicit-rerouting.test.js b/packages/astro/test/custom-404-implicit-rerouting.test.js index 5dcda1329d89..7e2ed30c8837 100644 --- a/packages/astro/test/custom-404-implicit-rerouting.test.js +++ b/packages/astro/test/custom-404-implicit-rerouting.test.js @@ -1,7 +1,7 @@ import assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; import testAdapter from './test-adapter.js'; +import { loadFixture } from './test-utils.js'; for (const caseNumber of [1, 2, 3, 4, 5]) { describe(`Custom 404 with implicit rerouting - Case #${caseNumber}`, () => { @@ -13,16 +13,16 @@ for (const caseNumber of [1, 2, 3, 4, 5]) { output: 'server', root: `./fixtures/custom-404-loop-case-${caseNumber}/`, site: 'http://example.com', - adapter: testAdapter() + adapter: testAdapter(), }); }); - describe("dev server", () => { + describe('dev server', () => { /** @type {import('./test-utils.js').DevServer} */ let devServer; before(async () => { - await fixture.build() + await fixture.build(); devServer = await fixture.startDevServer(); }); @@ -31,19 +31,19 @@ for (const caseNumber of [1, 2, 3, 4, 5]) { const response = await fixture.fetch('/'); assert.equal(response.status, 200); }); - + // IMPORTANT: never skip it('dev server stays responsive', { timeout: 1000 }, async () => { const response = await fixture.fetch('/alvsibdlvjks'); assert.equal(response.status, 404); }); - + after(async () => { await devServer.stop(); }); }); - - describe("prod server", () => { + + describe('prod server', () => { /** @type {import('./test-utils.js').App} */ let app; @@ -56,7 +56,7 @@ for (const caseNumber of [1, 2, 3, 4, 5]) { const response = await app.render(new Request('https://example.com/')); assert.equal(response.status, 200); }); - + // IMPORTANT: never skip it('prod server stays responsive', { timeout: 1000 }, async () => { const response = await app.render(new Request('https://example.com/alvsibdlvjks')); From 2713a662ca7e30e6d438462c288dd1af13cf5b30 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Tue, 9 Apr 2024 18:00:07 -0700 Subject: [PATCH 31/96] [ci] release (#10729) Co-authored-by: github-actions[bot] --- .changeset/large-knives-confess.md | 5 -- .changeset/sharp-elephants-clap.md | 5 -- .changeset/spotty-hounds-ring.md | 5 -- .changeset/swift-coats-teach.md | 12 ----- examples/basics/package.json | 2 +- examples/blog/package.json | 2 +- examples/component/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-lit/package.json | 2 +- examples/framework-multiple/package.json | 2 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 2 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 2 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/middleware/package.json | 2 +- examples/minimal/package.json | 2 +- examples/non-html-pages/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/view-transitions/package.json | 2 +- examples/with-markdoc/package.json | 2 +- examples/with-markdown-plugins/package.json | 2 +- examples/with-markdown-shiki/package.json | 2 +- examples/with-mdx/package.json | 2 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 2 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 17 +++++++ packages/astro/package.json | 2 +- packages/db/CHANGELOG.md | 6 +++ packages/db/package.json | 2 +- pnpm-lock.yaml | 54 ++++++++++----------- 36 files changed, 79 insertions(+), 83 deletions(-) delete mode 100644 .changeset/large-knives-confess.md delete mode 100644 .changeset/sharp-elephants-clap.md delete mode 100644 .changeset/spotty-hounds-ring.md delete mode 100644 .changeset/swift-coats-teach.md diff --git a/.changeset/large-knives-confess.md b/.changeset/large-knives-confess.md deleted file mode 100644 index 364054ce3793..000000000000 --- a/.changeset/large-knives-confess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes a regression where some very **specific** code rendered using `expressive-code` was not escaped properly. diff --git a/.changeset/sharp-elephants-clap.md b/.changeset/sharp-elephants-clap.md deleted file mode 100644 index b1bf39bfa308..000000000000 --- a/.changeset/sharp-elephants-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes a regression where constructing and returning 404 responses from a middleware resulted in the dev server getting stuck in a loop. diff --git a/.changeset/spotty-hounds-ring.md b/.changeset/spotty-hounds-ring.md deleted file mode 100644 index b423a2ade3d4..000000000000 --- a/.changeset/spotty-hounds-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/db": patch ---- - -Fix db seeding when srcDir is root diff --git a/.changeset/swift-coats-teach.md b/.changeset/swift-coats-teach.md deleted file mode 100644 index 52d7836a9123..000000000000 --- a/.changeset/swift-coats-teach.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"astro": patch ---- - -Fixes a false positive for `div` and `span` elements when running the Dev Toolbar accessibility audits. - -Those are special elements that don't have an interaction assigned by default. Instead, it is assigned through the `role` attribute. This means that cases like the following are now deemed correct: - -```html -
- -``` diff --git a/examples/basics/package.json b/examples/basics/package.json index 1b9fc248a81e..40fc8695da66 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index 25eefaf9184a..6a3c24b57ad9 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -14,6 +14,6 @@ "@astrojs/mdx": "^2.2.4", "@astrojs/rss": "^4.0.5", "@astrojs/sitemap": "^3.1.2", - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/component/package.json b/examples/component/package.json index 48ad487023a8..3d946e417242 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.5.17" + "astro": "^4.5.18" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index e009e4ffb389..4a604ab94795 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -14,6 +14,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.5", "alpinejs": "^3.13.3", - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json index f9de726c7df6..7a95577aeb53 100644 --- a/examples/framework-lit/package.json +++ b/examples/framework-lit/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/lit": "^4.0.1", "@webcomponents/template-shadowroot": "^0.2.1", - "astro": "^4.5.17", + "astro": "^4.5.18", "lit": "^3.1.2" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index 9d64ea79604e..2e5900dad665 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -18,7 +18,7 @@ "@astrojs/vue": "^4.0.11", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.5.17", + "astro": "^4.5.18", "preact": "^10.19.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index 328d98d75924..5fcdaa79402d 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.1.2", "@preact/signals": "^1.2.1", - "astro": "^4.5.17", + "astro": "^4.5.18", "preact": "^10.19.2" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index ecd9e44bf41f..726c9f1ba207 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -14,7 +14,7 @@ "@astrojs/react": "^3.2.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.5.17", + "astro": "^4.5.18", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index 1e855f24d440..d15776f40165 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/solid-js": "^4.0.1", - "astro": "^4.5.17", + "astro": "^4.5.18", "solid-js": "^1.8.5" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index 33c5b4de68f9..806691556a1b 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/svelte": "^5.3.0", - "astro": "^4.5.17", + "astro": "^4.5.18", "svelte": "^4.2.5" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index 802648883c98..042b0878f58e 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/vue": "^4.0.11", - "astro": "^4.5.17", + "astro": "^4.5.18", "vue": "^3.3.8" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index 007b11ff332d..f243a46a1eed 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index 32396390d004..d10058c6ca9a 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.5.17" + "astro": "^4.5.18" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/middleware/package.json b/examples/middleware/package.json index 36b466433830..ff0365f19d57 100644 --- a/examples/middleware/package.json +++ b/examples/middleware/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.5.17", + "astro": "^4.5.18", "html-minifier": "^4.0.0" }, "devDependencies": { diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 17a16c878d93..c6008d0106c1 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json index c3d1b7bd9dfb..f9637318df46 100644 --- a/examples/non-html-pages/package.json +++ b/examples/non-html-pages/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index 020a626e2864..ef688cad5c5a 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index ee80e0fac0c8..2833723dd471 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -14,7 +14,7 @@ "dependencies": { "@astrojs/node": "^8.2.5", "@astrojs/svelte": "^5.3.0", - "astro": "^4.5.17", + "astro": "^4.5.18", "svelte": "^4.2.5" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index c4c85737d0de..57bd5fb7bd63 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.17", + "astro": "^4.5.18", "sass": "^1.69.5", "sharp": "^0.32.6" } diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json index 2c00d468ee5a..ff75bb8c538f 100644 --- a/examples/view-transitions/package.json +++ b/examples/view-transitions/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@astrojs/tailwind": "^5.1.0", "@astrojs/node": "^8.2.5", - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index 61b394501faa..a14607f9a14f 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/markdoc": "^0.9.5", - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json index 5ce3fbdb3400..d24c98b8b90f 100644 --- a/examples/with-markdown-plugins/package.json +++ b/examples/with-markdown-plugins/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/markdown-remark": "^5.0.0", - "astro": "^4.5.17", + "astro": "^4.5.18", "hast-util-select": "^6.0.2", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json index 464f639cb6ed..6145c14ac7d0 100644 --- a/examples/with-markdown-shiki/package.json +++ b/examples/with-markdown-shiki/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.5.17" + "astro": "^4.5.18" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index 0f5005cf01c3..878740030530 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/mdx": "^2.2.4", "@astrojs/preact": "^3.1.2", - "astro": "^4.5.17", + "astro": "^4.5.18", "preact": "^10.19.2" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index 208ba5244955..47312f4269a8 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.1.2", "@nanostores/preact": "^0.5.0", - "astro": "^4.5.17", + "astro": "^4.5.18", "nanostores": "^0.9.5", "preact": "^10.19.2" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index 295b89a70b8f..d3696d1e57fa 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -14,7 +14,7 @@ "@astrojs/mdx": "^2.2.4", "@astrojs/tailwind": "^5.1.0", "@types/canvas-confetti": "^1.6.3", - "astro": "^4.5.17", + "astro": "^4.5.18", "autoprefixer": "^10.4.15", "canvas-confetti": "^1.9.1", "postcss": "^8.4.28", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 30ecf6968c88..fbbbcfd908c7 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -12,7 +12,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^4.5.17", + "astro": "^4.5.18", "vitest": "^1.3.1" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 5b835d97474d..4450a20e07a8 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,22 @@ # astro +## 4.5.18 + +### Patch Changes + +- [#10728](https://github.com/withastro/astro/pull/10728) [`f508c4b7d54316e737f454a3777204b23636d4a0`](https://github.com/withastro/astro/commit/f508c4b7d54316e737f454a3777204b23636d4a0) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a regression where some very **specific** code rendered using `expressive-code` was not escaped properly. + +- [#10737](https://github.com/withastro/astro/pull/10737) [`8a30f257b1f3618b01212a591b82ad7a63c82fbb`](https://github.com/withastro/astro/commit/8a30f257b1f3618b01212a591b82ad7a63c82fbb) Thanks [@lilnasy](https://github.com/lilnasy)! - Fixes a regression where constructing and returning 404 responses from a middleware resulted in the dev server getting stuck in a loop. + +- [#10719](https://github.com/withastro/astro/pull/10719) [`b21b3ba307235510707ee9f5bd49f71473a07004`](https://github.com/withastro/astro/commit/b21b3ba307235510707ee9f5bd49f71473a07004) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a false positive for `div` and `span` elements when running the Dev Toolbar accessibility audits. + + Those are special elements that don't have an interaction assigned by default. Instead, it is assigned through the `role` attribute. This means that cases like the following are now deemed correct: + + ```html +
+ + ``` + ## 4.5.17 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index b876f8e45b38..cb889a9cdccb 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "4.5.17", + "version": "4.5.18", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md index 75ad8dd37fdf..5c462e3c5084 100644 --- a/packages/db/CHANGELOG.md +++ b/packages/db/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/db +## 0.10.3 + +### Patch Changes + +- [#10720](https://github.com/withastro/astro/pull/10720) [`2d2ff58bb90e09248afc04cc8e2016ef983a7f07`](https://github.com/withastro/astro/commit/2d2ff58bb90e09248afc04cc8e2016ef983a7f07) Thanks [@matthewp](https://github.com/matthewp)! - Fix db seeding when srcDir is root + ## 0.10.2 ### Patch Changes diff --git a/packages/db/package.json b/packages/db/package.json index 7f70ddc23694..e58bf32b8f9b 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/db", - "version": "0.10.2", + "version": "0.10.3", "description": "", "license": "MIT", "type": "module", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fe401c54a44..9fc89506aff5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,7 +134,7 @@ importers: examples/basics: dependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/blog: @@ -149,13 +149,13 @@ importers: specifier: ^3.1.2 version: link:../../packages/integrations/sitemap astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/framework-alpine: @@ -170,7 +170,7 @@ importers: specifier: ^3.13.3 version: 3.13.8 astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/framework-lit: @@ -182,7 +182,7 @@ importers: specifier: ^0.2.1 version: 0.2.1 astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro lit: specifier: ^3.1.2 @@ -212,7 +212,7 @@ importers: specifier: ^18.2.15 version: 18.2.24 astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -242,7 +242,7 @@ importers: specifier: ^1.2.1 version: 1.2.1(preact@10.20.1) astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -260,7 +260,7 @@ importers: specifier: ^18.2.15 version: 18.2.24 astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro react: specifier: ^18.2.0 @@ -275,7 +275,7 @@ importers: specifier: ^4.0.1 version: link:../../packages/integrations/solid astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro solid-js: specifier: ^1.8.5 @@ -287,7 +287,7 @@ importers: specifier: ^5.3.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -299,7 +299,7 @@ importers: specifier: ^4.0.11 version: link:../../packages/integrations/vue astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro vue: specifier: ^3.3.8 @@ -311,13 +311,13 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/middleware: @@ -326,7 +326,7 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro html-minifier: specifier: ^4.0.0 @@ -339,19 +339,19 @@ importers: examples/minimal: dependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/non-html-pages: dependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/ssr: @@ -363,7 +363,7 @@ importers: specifier: ^5.3.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -372,7 +372,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro sass: specifier: ^1.69.5 @@ -390,7 +390,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/integrations/tailwind astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/with-markdoc: @@ -399,7 +399,7 @@ importers: specifier: ^0.9.5 version: link:../../packages/integrations/markdoc astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/with-markdown-plugins: @@ -408,7 +408,7 @@ importers: specifier: ^5.0.0 version: link:../../packages/markdown/remark astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro hast-util-select: specifier: ^6.0.2 @@ -429,7 +429,7 @@ importers: examples/with-markdown-shiki: dependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro examples/with-mdx: @@ -441,7 +441,7 @@ importers: specifier: ^3.1.2 version: link:../../packages/integrations/preact astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -456,7 +456,7 @@ importers: specifier: ^0.5.0 version: 0.5.1(nanostores@0.9.5)(preact@10.20.1) astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro nanostores: specifier: ^0.9.5 @@ -477,7 +477,7 @@ importers: specifier: ^1.6.3 version: 1.6.4 astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro autoprefixer: specifier: ^10.4.15 @@ -495,7 +495,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^4.5.17 + specifier: ^4.5.18 version: link:../../packages/astro vitest: specifier: ^1.3.1 From 5a6e22deabe04b01f2d2393dffa41d48ab9d09d4 Mon Sep 17 00:00:00 2001 From: liruifengv Date: Wed, 10 Apr 2024 18:58:19 +0800 Subject: [PATCH 32/96] fix: Fixed errorOverlay theme toggle bug. (#10661) * fix: save `localStorage.astroErrorOverlayTheme` when detected dark mode * add changeset * Fix theme toggle in ErrorOverlay * update changeset --- .changeset/short-flies-itch.md | 5 +++++ packages/astro/src/core/errors/overlay.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changeset/short-flies-itch.md diff --git a/.changeset/short-flies-itch.md b/.changeset/short-flies-itch.md new file mode 100644 index 000000000000..929bdec522aa --- /dev/null +++ b/.changeset/short-flies-itch.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixed errorOverlay theme toggle bug. diff --git a/packages/astro/src/core/errors/overlay.ts b/packages/astro/src/core/errors/overlay.ts index 282c79cd6a21..9bfc562ba46f 100644 --- a/packages/astro/src/core/errors/overlay.ts +++ b/packages/astro/src/core/errors/overlay.ts @@ -593,13 +593,14 @@ class ErrorOverlay extends HTMLElement { window.matchMedia('(prefers-color-scheme: dark)').matches) ) { this?.classList.add('astro-dark'); + localStorage.astroErrorOverlayTheme = 'dark'; themeToggle!.checked = true; } else { this?.classList.remove('astro-dark'); themeToggle!.checked = false; } themeToggle?.addEventListener('click', () => { - const isDark = localStorage.astroErrorOverlayTheme === 'dark'; + const isDark = localStorage.astroErrorOverlayTheme === 'dark' || this?.classList.contains('astro-dark'); this?.classList.toggle('astro-dark', !isDark); localStorage.astroErrorOverlayTheme = isDark ? 'light' : 'dark'; }); From 56e8b8508d69dc8bf9e271a6bb220efb4111f655 Mon Sep 17 00:00:00 2001 From: liruifengv Date: Wed, 10 Apr 2024 10:59:24 +0000 Subject: [PATCH 33/96] [ci] format --- packages/astro/src/core/errors/overlay.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/astro/src/core/errors/overlay.ts b/packages/astro/src/core/errors/overlay.ts index 9bfc562ba46f..90eff7bc7aa8 100644 --- a/packages/astro/src/core/errors/overlay.ts +++ b/packages/astro/src/core/errors/overlay.ts @@ -600,7 +600,8 @@ class ErrorOverlay extends HTMLElement { themeToggle!.checked = false; } themeToggle?.addEventListener('click', () => { - const isDark = localStorage.astroErrorOverlayTheme === 'dark' || this?.classList.contains('astro-dark'); + const isDark = + localStorage.astroErrorOverlayTheme === 'dark' || this?.classList.contains('astro-dark'); this?.classList.toggle('astro-dark', !isDark); localStorage.astroErrorOverlayTheme = isDark ? 'light' : 'dark'; }); From b6b21b82dbdbdee4075a3ea0dad6ac1e1a41100c Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 10 Apr 2024 14:53:32 +0100 Subject: [PATCH 34/96] feat: add origin check for CSRF protection (#10678) * feat: add origin check for CSRF protection * add tests * chore: documentation * changeset and grammar * chore: add casing check * split function * better naming * make the whole object experimental * remove unused type * update changeset * manually apply Sarah's suggestions * Apply suggestions from code review Co-authored-by: Sarah Rainsberger --------- Co-authored-by: Sarah Rainsberger --- .changeset/fair-jars-behave.md | 24 +++ packages/astro/src/@types/astro.ts | 56 +++++ packages/astro/src/core/app/index.ts | 9 + packages/astro/src/core/app/middlewares.ts | 42 ++++ packages/astro/src/core/app/types.ts | 1 + packages/astro/src/core/build/generate.ts | 1 + .../src/core/build/plugins/plugin-manifest.ts | 1 + packages/astro/src/core/config/schema.ts | 12 ++ .../src/vite-plugin-astro-server/plugin.ts | 1 + packages/astro/test/csrf-protection.test.js | 196 ++++++++++++++++++ .../csrf-check-origin/astro.config.mjs | 14 ++ .../fixtures/csrf-check-origin/package.json | 8 + .../csrf-check-origin/src/pages/api.ts | 29 +++ pnpm-lock.yaml | 6 + 14 files changed, 400 insertions(+) create mode 100644 .changeset/fair-jars-behave.md create mode 100644 packages/astro/src/core/app/middlewares.ts create mode 100644 packages/astro/test/csrf-protection.test.js create mode 100644 packages/astro/test/fixtures/csrf-check-origin/astro.config.mjs create mode 100644 packages/astro/test/fixtures/csrf-check-origin/package.json create mode 100644 packages/astro/test/fixtures/csrf-check-origin/src/pages/api.ts diff --git a/.changeset/fair-jars-behave.md b/.changeset/fair-jars-behave.md new file mode 100644 index 000000000000..700b1b883021 --- /dev/null +++ b/.changeset/fair-jars-behave.md @@ -0,0 +1,24 @@ +--- +"astro": minor +--- + +Adds a new experimental security option to prevent [Cross-Site Request Forgery (CSRF) attacks](https://owasp.org/www-community/attacks/csrf). This feature is available only for pages rendered on demand: + +```js +import { defineConfig } from "astro/config" +export default defineConfig({ + experimental: { + security: { + csrfProtection: { + origin: true + } + } + } +}) +``` + +Enabling this setting performs a check that the "origin" header, automatically passed by all modern browsers, matches the URL sent by each `Request`. + +This experimental "origin" check is executed only for pages rendered on demand, and only for the requests `POST, `PATCH`, `DELETE` and `PUT` with one of the following `content-type` headers: 'application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'. + +It the "origin" header doesn't match the pathname of the request, Astro will return a 403 status code and won't render the page. diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index e39689a25b75..9d75bd84e1b6 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1821,6 +1821,62 @@ export interface AstroUserConfig { * See the [Internationalization Guide](https://docs.astro.build/en/guides/internationalization/#domains-experimental) for more details, including the limitations of this experimental feature. */ i18nDomains?: boolean; + + /** + * @docs + * @name experimental.security + * @type {boolean} + * @default `false` + * @version 4.6.0 + * @description + * + * Enables CSRF protection for Astro websites. + * + * The CSRF protection works only for pages rendered on demand (SSR) using `server` or `hybrid` mode. The pages must opt out of prerendering in `hybrid` mode. + * + * ```js + * // astro.config.mjs + * export default defineConfig({ + * output: "server", + * experimental: { + * security: { + * csrfProtection: { + * origin: true + * } + * } + * } + * }) + * ``` + */ + security?: { + /** + * @name security.csrfProtection + * @type {object} + * @default '{}' + * @version 4.6.0 + * @description + * + * Allows you to enable security measures to prevent CSRF attacks: https://owasp.org/www-community/attacks/csrf + */ + + csrfProtection?: { + /** + * @name security.csrfProtection.origin + * @type {boolean} + * @default 'false' + * @version 4.6.0 + * @description + * + * When enabled, performs a check that the "origin" header, automatically passed by all modern browsers, matches the URL sent by each `Request`. + * + * The "origin" check is executed only for pages rendered on demand, and only for the requests `POST, `PATCH`, `DELETE` and `PUT` with + * the following `content-type` header: 'application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'. + * + * If the "origin" header doesn't match the `pathname` of the request, Astro will return a 403 status code and will not render the page. + */ + origin?: boolean; + }; + }; }; } diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts index 7c1480bd7662..cb7a8d9db188 100644 --- a/packages/astro/src/core/app/index.ts +++ b/packages/astro/src/core/app/index.ts @@ -31,6 +31,8 @@ import { createAssetLink } from '../render/ssr-element.js'; import { ensure404Route } from '../routing/astro-designed-error-pages.js'; import { matchRoute } from '../routing/match.js'; import { AppPipeline } from './pipeline.js'; +import { sequence } from '../middleware/index.js'; +import { createOriginCheckMiddleware } from './middlewares.js'; export { deserializeManifest } from './common.js'; export interface RenderOptions { @@ -112,6 +114,13 @@ export class App { * @private */ #createPipeline(streaming = false) { + if (this.#manifest.checkOrigin) { + this.#manifest.middleware = sequence( + createOriginCheckMiddleware(), + this.#manifest.middleware + ); + } + return AppPipeline.create({ logger: this.#logger, manifest: this.#manifest, diff --git a/packages/astro/src/core/app/middlewares.ts b/packages/astro/src/core/app/middlewares.ts new file mode 100644 index 000000000000..095158b42ba3 --- /dev/null +++ b/packages/astro/src/core/app/middlewares.ts @@ -0,0 +1,42 @@ +import type { MiddlewareHandler } from '../../@types/astro.js'; +import { defineMiddleware } from '../middleware/index.js'; + +/** + * Content types that can be passed when sending a request via a form + * + * https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype + * @private + */ +const FORM_CONTENT_TYPES = [ + 'application/x-www-form-urlencoded', + 'multipart/form-data', + 'text/plain', +]; + +/** + * Returns a middleware function in charge to check the `origin` header. + * + * @private + */ +export function createOriginCheckMiddleware(): MiddlewareHandler { + return defineMiddleware((context, next) => { + const { request, url } = context; + const contentType = request.headers.get('content-type'); + if (contentType) { + if (FORM_CONTENT_TYPES.includes(contentType.toLowerCase())) { + const forbidden = + (request.method === 'POST' || + request.method === 'PUT' || + request.method === 'PATCH' || + request.method === 'DELETE') && + request.headers.get('origin') !== url.origin; + if (forbidden) { + return new Response(`Cross-site ${request.method} form submissions are forbidden`, { + status: 403, + }); + } + } + } + return next(); + }); +} diff --git a/packages/astro/src/core/app/types.ts b/packages/astro/src/core/app/types.ts index 2596ab3a69f2..e919e80e456f 100644 --- a/packages/astro/src/core/app/types.ts +++ b/packages/astro/src/core/app/types.ts @@ -64,6 +64,7 @@ export type SSRManifest = { pageMap?: Map; i18n: SSRManifestI18n | undefined; middleware: MiddlewareHandler; + checkOrigin: boolean; }; export type SSRManifestI18n = { diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index d82ecdbd8daa..e7ddc6de9ffa 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -615,5 +615,6 @@ function createBuildManifest( i18n: i18nManifest, buildFormat: settings.config.build.format, middleware, + checkOrigin: settings.config.experimental.security?.csrfProtection?.origin ?? false, }; } diff --git a/packages/astro/src/core/build/plugins/plugin-manifest.ts b/packages/astro/src/core/build/plugins/plugin-manifest.ts index 24437d4e5765..393442861d35 100644 --- a/packages/astro/src/core/build/plugins/plugin-manifest.ts +++ b/packages/astro/src/core/build/plugins/plugin-manifest.ts @@ -276,5 +276,6 @@ function buildManifest( assets: staticFiles.map(prefixAssetPath), i18n: i18nManifest, buildFormat: settings.config.build.format, + checkOrigin: settings.config.experimental.security?.csrfProtection?.origin ?? false, }; } diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index ef1a6ec85d67..58bea2f2b8f7 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -86,6 +86,7 @@ const ASTRO_CONFIG_DEFAULTS = { clientPrerender: false, globalRoutePriority: false, i18nDomains: false, + security: {}, }, } satisfies AstroUserConfig & { server: { open: boolean } }; @@ -508,6 +509,17 @@ export const AstroConfigSchema = z.object({ .boolean() .optional() .default(ASTRO_CONFIG_DEFAULTS.experimental.globalRoutePriority), + security: z + .object({ + csrfProtection: z + .object({ + origin: z.boolean().default(false), + }) + .optional() + .default({}), + }) + .optional() + .default(ASTRO_CONFIG_DEFAULTS.experimental.security), i18nDomains: z.boolean().optional().default(ASTRO_CONFIG_DEFAULTS.experimental.i18nDomains), }) .strict( diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index b08bcb4ebd57..3d2889735b0d 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -143,6 +143,7 @@ export function createDevelopmentManifest(settings: AstroSettings): SSRManifest componentMetadata: new Map(), inlinedScripts: new Map(), i18n: i18nManifest, + checkOrigin: settings.config.experimental.security?.csrfProtection?.origin ?? false, middleware(_, next) { return next(); }, diff --git a/packages/astro/test/csrf-protection.test.js b/packages/astro/test/csrf-protection.test.js new file mode 100644 index 000000000000..ab76a18f5b81 --- /dev/null +++ b/packages/astro/test/csrf-protection.test.js @@ -0,0 +1,196 @@ +import { before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; +import testAdapter from './test-adapter.js'; +import assert from 'node:assert/strict'; + +describe('CSRF origin check', () => { + let app; + + before(async () => { + const fixture = await loadFixture({ + root: './fixtures/csrf-check-origin/', + adapter: testAdapter(), + }); + await fixture.build(); + app = await fixture.loadTestAdapterApp(); + }); + + it("return 403 when the origin doesn't match and calling a POST", async () => { + let request; + let response; + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'multipart/form-data' }, + method: 'POST', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + // case where content-type has different casing + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'MULTIPART/FORM-DATA' }, + method: 'POST', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'application/x-www-form-urlencoded' }, + method: 'POST', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'text/plain' }, + method: 'POST', + }); + response = await app.render(request); + assert.equal(response.status, 403); + }); + + it("return 403 when the origin doesn't match and calling a PUT", async () => { + let request; + let response; + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'multipart/form-data' }, + method: 'PUT', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'application/x-www-form-urlencoded' }, + method: 'PUT', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'text/plain' }, + method: 'PUT', + }); + response = await app.render(request); + assert.equal(response.status, 403); + }); + + it("return 403 when the origin doesn't match and calling a DELETE", async () => { + let request; + let response; + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'multipart/form-data' }, + method: 'DELETE', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'application/x-www-form-urlencoded' }, + method: 'DELETE', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'text/plain' }, + method: 'DELETE', + }); + response = await app.render(request); + assert.equal(response.status, 403); + }); + + it("return 403 when the origin doesn't match and calling a PATCH", async () => { + let request; + let response; + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'multipart/form-data' }, + method: 'PATCH', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'application/x-www-form-urlencoded' }, + method: 'PATCH', + }); + response = await app.render(request); + assert.equal(response.status, 403); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'text/plain' }, + method: 'PATCH', + }); + response = await app.render(request); + assert.equal(response.status, 403); + }); + + it("return a 200 when the origin doesn't match but calling a GET", async () => { + let request; + let response; + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'multipart/form-data' }, + method: 'GET', + }); + response = await app.render(request); + assert.equal(response.status, 200); + assert.deepEqual(await response.json(), { + something: 'true', + }); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'application/x-www-form-urlencoded' }, + method: 'GET', + }); + response = await app.render(request); + assert.equal(response.status, 200); + assert.deepEqual(await response.json(), { + something: 'true', + }); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://loreum.com', 'content-type': 'text/plain' }, + method: 'GET', + }); + response = await app.render(request); + assert.equal(response.status, 200); + assert.deepEqual(await response.json(), { + something: 'true', + }); + }); + + it('return 200 when calling POST/PUT/DELETE/PATCH with the correct origin', async () => { + let request; + let response; + request = new Request('http://example.com/api/', { + headers: { origin: 'http://example.com', 'content-type': 'multipart/form-data' }, + method: 'POST', + }); + response = await app.render(request); + assert.equal(response.status, 200); + assert.deepEqual(await response.json(), { + something: 'true', + }); + + request = new Request('http://example.com/api/', { + headers: { + origin: 'http://example.com', + 'content-type': 'application/x-www-form-urlencoded', + }, + method: 'PUT', + }); + response = await app.render(request); + assert.equal(response.status, 200); + assert.deepEqual(await response.json(), { + something: 'true', + }); + + request = new Request('http://example.com/api/', { + headers: { origin: 'http://example.com', 'content-type': 'text/plain' }, + method: 'PATCH', + }); + response = await app.render(request); + assert.equal(response.status, 200); + assert.deepEqual(await response.json(), { + something: 'true', + }); + }); +}); diff --git a/packages/astro/test/fixtures/csrf-check-origin/astro.config.mjs b/packages/astro/test/fixtures/csrf-check-origin/astro.config.mjs new file mode 100644 index 000000000000..af516bcd9736 --- /dev/null +++ b/packages/astro/test/fixtures/csrf-check-origin/astro.config.mjs @@ -0,0 +1,14 @@ +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({ + output: "server", + experimental: { + security: { + csrfProtection: { + origin: true + } + } + } +}); + diff --git a/packages/astro/test/fixtures/csrf-check-origin/package.json b/packages/astro/test/fixtures/csrf-check-origin/package.json new file mode 100644 index 000000000000..1573627d8d4e --- /dev/null +++ b/packages/astro/test/fixtures/csrf-check-origin/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/csrf", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/csrf-check-origin/src/pages/api.ts b/packages/astro/test/fixtures/csrf-check-origin/src/pages/api.ts new file mode 100644 index 000000000000..8aa35cc25859 --- /dev/null +++ b/packages/astro/test/fixtures/csrf-check-origin/src/pages/api.ts @@ -0,0 +1,29 @@ +export const GET = () => { + return Response.json({ + something: 'true', + }); +}; + +export const POST = () => { + return Response.json({ + something: 'true', + }); +}; + +export const PUT = () => { + return Response.json({ + something: 'true', + }); +}; + +export const DELETE = () => { + return Response.json({ + something: 'true', + }); +}; + +export const PATCH = () => { + return Response.json({ + something: 'true', + }); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fc89506aff5..49a565827545 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2559,6 +2559,12 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/csrf-check-origin: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/css-assets: dependencies: '@test/astro-font-awesome-package': From 6b1557a42b9d64abaf1f39c641ea41b7f657aca2 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 10 Apr 2024 14:53:55 +0100 Subject: [PATCH 35/96] feat: upgrade the minimum Node.js maintainance LTS version (#10689) * feat: upgrade the minimum Node.js maintainance LTS version * chore: update minimum npm version * chore: revert npm change * chore: address Erika's feedback * chore: apply further suggestions * Update .changeset/empty-rules-type.md Co-authored-by: Sarah Rainsberger --------- Co-authored-by: Sarah Rainsberger --- .changeset/empty-rules-type.md | 17 +++++++++++++++++ package.json | 2 +- packages/astro-prism/package.json | 2 +- packages/astro/package.json | 5 +++-- packages/create-astro/package.json | 2 +- packages/integrations/markdoc/package.json | 2 +- packages/integrations/mdx/package.json | 2 +- packages/integrations/preact/package.json | 2 +- packages/integrations/react/package.json | 2 +- packages/integrations/solid/package.json | 2 +- packages/integrations/svelte/package.json | 2 +- packages/integrations/vue/package.json | 2 +- packages/telemetry/package.json | 2 +- packages/upgrade/package.json | 2 +- 14 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 .changeset/empty-rules-type.md diff --git a/.changeset/empty-rules-type.md b/.changeset/empty-rules-type.md new file mode 100644 index 000000000000..fd4933291b7f --- /dev/null +++ b/.changeset/empty-rules-type.md @@ -0,0 +1,17 @@ +--- +"@astrojs/markdoc": minor +"@astrojs/preact": minor +"@astrojs/svelte": minor +"@astrojs/react": minor +"@astrojs/solid-js": minor +"@astrojs/mdx": minor +"@astrojs/vue": minor +"create-astro": minor +"@astrojs/prism": minor +"@astrojs/telemetry": minor +"@astrojs/upgrade": minor +"astro": minor +--- + +Upgrades the minimum version of Node.js to `v18.20.1`. This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support). + diff --git a/package.json b/package.json index 0222a1a302b6..009cf5445426 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "packages/*" ], "engines": { - "node": ">=18.14.1", + "node": "^18.17.1 || ^20.3.0 || >=21.0.0", "pnpm": ">=8.6.12" }, "packageManager": "pnpm@8.6.12", diff --git a/packages/astro-prism/package.json b/packages/astro-prism/package.json index d62e819a8253..584ebce935e3 100644 --- a/packages/astro-prism/package.json +++ b/packages/astro-prism/package.json @@ -39,6 +39,6 @@ "astro-scripts": "workspace:*" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" } } diff --git a/packages/astro/package.json b/packages/astro/package.json index cb889a9cdccb..1365fc56e627 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -224,8 +224,9 @@ "unified": "^11.0.4" }, "engines": { - "node": ">=18.14.1", - "npm": ">=6.14.0" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" }, "publishConfig": { "provenance": true diff --git a/packages/create-astro/package.json b/packages/create-astro/package.json index dceda919481b..4b2fc5872d7e 100644 --- a/packages/create-astro/package.json +++ b/packages/create-astro/package.json @@ -41,7 +41,7 @@ "strip-json-comments": "^5.0.1" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/markdoc/package.json b/packages/integrations/markdoc/package.json index d67001e75ce1..883d61f30c7e 100644 --- a/packages/integrations/markdoc/package.json +++ b/packages/integrations/markdoc/package.json @@ -86,7 +86,7 @@ "vite": "^5.1.4" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index 89dba4e92b87..4fc7d2b9a1a3 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -75,7 +75,7 @@ "vite": "^5.1.4" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/preact/package.json b/packages/integrations/preact/package.json index 37ac943311d9..9861046d1583 100644 --- a/packages/integrations/preact/package.json +++ b/packages/integrations/preact/package.json @@ -52,7 +52,7 @@ "preact": "^10.6.5" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/react/package.json b/packages/integrations/react/package.json index 87a104de5835..b7555bf28cc1 100644 --- a/packages/integrations/react/package.json +++ b/packages/integrations/react/package.json @@ -66,7 +66,7 @@ "react-dom": "^17.0.2 || ^18.0.0" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/solid/package.json b/packages/integrations/solid/package.json index 3efd536fe599..819759a7b870 100644 --- a/packages/integrations/solid/package.json +++ b/packages/integrations/solid/package.json @@ -46,7 +46,7 @@ "solid-js": "^1.8.5" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/svelte/package.json b/packages/integrations/svelte/package.json index d20d3c5a27eb..0c7c77b50230 100644 --- a/packages/integrations/svelte/package.json +++ b/packages/integrations/svelte/package.json @@ -57,7 +57,7 @@ "typescript": "^5.3.3" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json index 28f3655efc59..18f48bfff678 100644 --- a/packages/integrations/vue/package.json +++ b/packages/integrations/vue/package.json @@ -58,7 +58,7 @@ "vue": "^3.2.30" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index 206ecf54cb42..d325fec14eb7 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -45,7 +45,7 @@ "astro-scripts": "workspace:*" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" }, "publishConfig": { "provenance": true diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 8d31efaf5db4..4869b0b0b420 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -42,6 +42,6 @@ "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=18.14.1" + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" } } From eb7f4b61fc77bd1e7780b934e38ba6f9ec197e79 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 10 Apr 2024 13:55:07 +0000 Subject: [PATCH 36/96] [ci] format --- packages/astro/src/core/app/index.ts | 4 ++-- packages/astro/test/csrf-protection.test.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts index cb7a8d9db188..116151610e1c 100644 --- a/packages/astro/src/core/app/index.ts +++ b/packages/astro/src/core/app/index.ts @@ -18,6 +18,7 @@ import { getSetCookiesFromResponse } from '../cookies/index.js'; import { AstroError, AstroErrorData } from '../errors/index.js'; import { consoleLogDestination } from '../logger/console.js'; import { AstroIntegrationLogger, Logger } from '../logger/core.js'; +import { sequence } from '../middleware/index.js'; import { appendForwardSlash, collapseDuplicateSlashes, @@ -30,9 +31,8 @@ import { RenderContext } from '../render-context.js'; import { createAssetLink } from '../render/ssr-element.js'; import { ensure404Route } from '../routing/astro-designed-error-pages.js'; import { matchRoute } from '../routing/match.js'; -import { AppPipeline } from './pipeline.js'; -import { sequence } from '../middleware/index.js'; import { createOriginCheckMiddleware } from './middlewares.js'; +import { AppPipeline } from './pipeline.js'; export { deserializeManifest } from './common.js'; export interface RenderOptions { diff --git a/packages/astro/test/csrf-protection.test.js b/packages/astro/test/csrf-protection.test.js index ab76a18f5b81..25aa9d059050 100644 --- a/packages/astro/test/csrf-protection.test.js +++ b/packages/astro/test/csrf-protection.test.js @@ -1,7 +1,7 @@ +import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; import testAdapter from './test-adapter.js'; -import assert from 'node:assert/strict'; +import { loadFixture } from './test-utils.js'; describe('CSRF origin check', () => { let app; From 1892772c9f7bce10434078d4760961667044b4b5 Mon Sep 17 00:00:00 2001 From: Farzad Date: Wed, 10 Apr 2024 10:18:54 -0400 Subject: [PATCH 37/96] Accept common cookie attributes when deleting a cookie (#10671) * Accept common cookie attributes when deleting a cookie * Fix AstroCookieSetOptions IDE annotations * Use AstroCookieSetOptions to construct AstroCookieDeleteOptions * Update .changeset/shaggy-cats-film.md Co-authored-by: Florian Lefebvre --------- Co-authored-by: Florian Lefebvre --- .changeset/shaggy-cats-film.md | 5 +++ packages/astro/src/core/cookies/cookies.ts | 35 ++++++++--------- .../astro/test/units/cookies/delete.test.js | 39 +++++++++++++++++-- 3 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 .changeset/shaggy-cats-film.md diff --git a/.changeset/shaggy-cats-film.md b/.changeset/shaggy-cats-film.md new file mode 100644 index 000000000000..4aaecea6c026 --- /dev/null +++ b/.changeset/shaggy-cats-film.md @@ -0,0 +1,5 @@ +--- +"astro": minor +--- + +Adds the `httpOnly`, `sameSite`, and `secure` options when deleting a cookie diff --git a/packages/astro/src/core/cookies/cookies.ts b/packages/astro/src/core/cookies/cookies.ts index 862d86ff0364..069afc796e9c 100644 --- a/packages/astro/src/core/cookies/cookies.ts +++ b/packages/astro/src/core/cookies/cookies.ts @@ -2,22 +2,16 @@ import type { CookieSerializeOptions } from 'cookie'; import { parse, serialize } from 'cookie'; import { AstroError, AstroErrorData } from '../errors/index.js'; -export interface AstroCookieSetOptions { - domain?: string; - expires?: Date; - httpOnly?: boolean; - maxAge?: number; - path?: string; - sameSite?: boolean | 'lax' | 'none' | 'strict'; - secure?: boolean; - encode?: (value: string) => string; -} +export type AstroCookieSetOptions = Pick< + CookieSerializeOptions, + 'domain' | 'path' | 'expires' | 'maxAge' | 'httpOnly' | 'sameSite' | 'secure' | 'encode' +>; export interface AstroCookieGetOptions { decode?: (value: string) => string; } -type AstroCookieDeleteOptions = Pick; +type AstroCookieDeleteOptions = Omit; interface AstroCookieInterface { value: string; @@ -78,17 +72,22 @@ class AstroCookies implements AstroCookiesInterface { * @param options Options related to this deletion, such as the path of the cookie. */ delete(key: string, options?: AstroCookieDeleteOptions): void { + /** + * The `@ts-expect-error` is necessary because `maxAge` and `expires` properties + * must not appear in the AstroCookieDeleteOptions type. + */ + const { + // @ts-expect-error + maxAge: _ignoredMaxAge, + // @ts-expect-error + expires: _ignoredExpires, + ...sanitizedOptions + } = options || {}; const serializeOptions: CookieSerializeOptions = { expires: DELETED_EXPIRATION, + ...sanitizedOptions, }; - if (options?.domain) { - serializeOptions.domain = options.domain; - } - if (options?.path) { - serializeOptions.path = options.path; - } - // Set-Cookie: token=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT this.#ensureOutgoingMap().set(key, [ DELETED_VALUE, diff --git a/packages/astro/test/units/cookies/delete.test.js b/packages/astro/test/units/cookies/delete.test.js index 4b5f188e1a17..39a5d7daed56 100644 --- a/packages/astro/test/units/cookies/delete.test.js +++ b/packages/astro/test/units/cookies/delete.test.js @@ -47,26 +47,57 @@ describe('astro/src/core/cookies', () => { assert.equal(cookies.has('foo'), false); }); - it('can provide a path', () => { + it('deletes a cookie with attributes', () => { let req = new Request('http://example.com/'); let cookies = new AstroCookies(req); + cookies.delete('foo', { + domain: 'example.com', path: '/subpath/', + priority: 'high', + secure: true, + httpOnly: true, + sameSite: 'strict', }); + let headers = Array.from(cookies.headers()); assert.equal(headers.length, 1); + assert.equal(/foo=deleted/.test(headers[0]), true); + assert.equal(/Expires=Thu, 01 Jan 1970 00:00:00 GMT/.test(headers[0]), true); + assert.equal(/Domain=example.com/.test(headers[0]), true); assert.equal(/Path=\/subpath\//.test(headers[0]), true); + assert.equal(/Priority=High/.test(headers[0]), true); + assert.equal(/Secure/.test(headers[0]), true); + assert.equal(/HttpOnly/.test(headers[0]), true); + assert.equal(/SameSite=Strict/.test(headers[0]), true); + }); + + it('ignores expires option', () => { + let req = new Request('http://example.com/'); + let cookies = new AstroCookies(req); + + cookies.delete('foo', { + expires: new Date(), + }); + + let headers = Array.from(cookies.headers()); + assert.equal(headers.length, 1); + assert.equal(/foo=deleted/.test(headers[0]), true); + assert.equal(/Expires=Thu, 01 Jan 1970 00:00:00 GMT/.test(headers[0]), true); }); - it('can provide a domain', () => { + it('ignores maxAge option', () => { let req = new Request('http://example.com/'); let cookies = new AstroCookies(req); + cookies.delete('foo', { - domain: '.example.com', + maxAge: 60, }); + let headers = Array.from(cookies.headers()); assert.equal(headers.length, 1); - assert.equal(/Domain=\.example\.com/.test(headers[0]), true); + assert.equal(/foo=deleted/.test(headers[0]), true); + assert.equal(/Expires=Thu, 01 Jan 1970 00:00:00 GMT/.test(headers[0]), true); }); }); }); From 5d086c3be2dfe258bb726d1849aae8270cf61c27 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 10 Apr 2024 15:38:17 +0100 Subject: [PATCH 38/96] feat(i18n): manual routing (#10193) * feat(i18n): manual routing * one more function * different typing * tests * fix merge * throw error for missing middleware * rename function * fix conflicts * lock file update * fix options, error thrown and added tests * rebase * add tests * docs * lock file black magic * increase timeout? * fix regression * merge conflict * add changeset * chore: apply suggestions * apply suggestion * Update .changeset/little-hornets-give.md Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com> * chore: address feedback * fix regression of last commit * update name * add comments * fix regression * remove unused code * Apply suggestions from code review Co-authored-by: Sarah Rainsberger * chore: update reference * Update packages/astro/src/@types/astro.ts Co-authored-by: Sarah Rainsberger * chore: improve types * fix regression in tests * apply Sarah's suggestion --------- Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com> Co-authored-by: Sarah Rainsberger --- .changeset/little-hornets-give.md | 48 +++++ packages/astro/src/@types/astro.ts | 124 ++++++----- packages/astro/src/core/app/types.ts | 2 +- packages/astro/src/core/base-pipeline.ts | 10 +- packages/astro/src/core/build/generate.ts | 2 +- .../src/core/build/plugins/plugin-manifest.ts | 2 +- packages/astro/src/core/config/schema.ts | 34 +-- packages/astro/src/core/errors/errors-data.ts | 29 ++- .../astro/src/core/middleware/vite-plugin.ts | 8 + .../astro/src/core/routing/manifest/create.ts | 2 +- packages/astro/src/i18n/index.ts | 148 ++++++++++++- packages/astro/src/i18n/middleware.ts | 157 ++++---------- packages/astro/src/i18n/utils.ts | 39 ++-- packages/astro/src/virtual-modules/i18n.ts | 204 +++++++++++++++++- .../src/vite-plugin-astro-server/plugin.ts | 2 +- .../src/vite-plugin-astro-server/route.ts | 2 +- .../astro.config.mjs | 14 ++ .../package.json | 8 + .../src/middleware.js | 22 ++ .../src/pages/about.astro | 8 + .../src/pages/blog.astro | 8 + .../src/pages/en/blog/[id].astro | 18 ++ .../src/pages/en/start.astro | 8 + .../src/pages/index.astro | 8 + .../src/pages/pt/blog/[id].astro | 18 ++ .../src/pages/pt/start.astro | 12 ++ .../src/pages/spanish/index.astro | 14 ++ .../i18n-routing-manual/astro.config.mjs | 14 ++ .../fixtures/i18n-routing-manual/package.json | 8 + .../i18n-routing-manual/src/middleware.js | 20 ++ .../src/pages/en/blog/[id].astro | 18 ++ .../src/pages/en/blog/index.astro | 8 + .../src/pages/en/index.astro | 8 + .../src/pages/en/start.astro | 8 + .../i18n-routing-manual/src/pages/help.astro | 11 + .../i18n-routing-manual/src/pages/index.astro | 8 + .../src/pages/pt/blog/[id].astro | 18 ++ .../src/pages/pt/start.astro | 12 ++ .../src/pages/spanish/index.astro | 14 ++ ...ing-manual-with-default-middleware.test.js | 96 +++++++++ .../astro/test/i18n-routing-manual.test.js | 147 +++++++++++++ packages/astro/test/i18n-routing.test.js | 1 - .../astro/test/units/i18n/astro_i18n.test.js | 78 +++---- pnpm-lock.yaml | 12 ++ scripts/cmd/test.js | 2 +- 45 files changed, 1176 insertions(+), 258 deletions(-) create mode 100644 .changeset/little-hornets-give.md create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/package.json create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/about.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/blog.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/blog/[id].astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/start.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/index.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/blog/[id].astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/start.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/spanish/index.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/astro.config.mjs create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/package.json create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/[id].astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/index.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/index.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/start.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/help.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/index.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/blog/[id].astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/start.astro create mode 100644 packages/astro/test/fixtures/i18n-routing-manual/src/pages/spanish/index.astro create mode 100644 packages/astro/test/i18n-routing-manual-with-default-middleware.test.js create mode 100644 packages/astro/test/i18n-routing-manual.test.js diff --git a/.changeset/little-hornets-give.md b/.changeset/little-hornets-give.md new file mode 100644 index 000000000000..fdbb6492eec0 --- /dev/null +++ b/.changeset/little-hornets-give.md @@ -0,0 +1,48 @@ +--- +"astro": minor +--- + +Adds a new i18n routing option `manual` to allow you to write your own i18n middleware: + +```js +import { defineConfig } from "astro/config" +// astro.config.mjs +export default defineConfig({ + i18n: { + locales: ["en", "fr"], + defaultLocale: "fr", + routing: "manual" + } +}) +``` + +Adding `routing: "manual"` to your i18n config disables Astro's own i18n middleware and provides you with helper functions to write your own: `redirectToDefaultLocale`, `notFound`, and `redirectToFallback`: + +```js +// middleware.js +import { redirectToDefaultLocale } from "astro:i18n"; +export const onRequest = defineMiddleware(async (context, next) => { + if (context.url.startsWith("/about")) { + return next() + } else { + return redirectToDefaultLocale(context, 302); + } +}) +``` + +Also adds a `middleware` function that manually creates Astro's i18n middleware. This allows you to extend Astro's i18n routing instead of completely replacing it. Run `middleware` in combination with your own middleware, using the `sequence` utility to determine the order: + +```js title="src/middleware.js" +import {defineMiddleware, sequence} from "astro:middleware"; +import { middleware } from "astro:i18n"; // Astro's own i18n routing config + +export const userMiddleware = defineMiddleware(); + +export const onRequest = sequence( + userMiddleware, + middleware({ + redirectToDefaultLocale: false, + prefixDefaultLocale: true + }) +) +``` diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 9d75bd84e1b6..2101b62cd601 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1494,66 +1494,80 @@ export interface AstroUserConfig { * * Controls the routing strategy to determine your site URLs. Set this based on your folder/URL path configuration for your default language. */ - routing?: { + // prettier-ignore + routing?: /** - * @docs - * @name i18n.routing.prefixDefaultLocale - * @kind h4 - * @type {boolean} - * @default `false` - * @version 3.7.0 - * @description * - * When `false`, only non-default languages will display a language prefix. - * The `defaultLocale` will not show a language prefix and content files do not exist in a localized folder. - * URLs will be of the form `example.com/[locale]/content/` for all non-default languages, but `example.com/content/` for the default locale. - * - * When `true`, all URLs will display a language prefix. - * URLs will be of the form `example.com/[locale]/content/` for every route, including the default language. - * Localized folders are used for every language, including the default. - */ - prefixDefaultLocale?: boolean; - - /** * @docs - * @name i18n.routing.redirectToDefaultLocale - * @kind h4 - * @type {boolean} - * @default `true` - * @version 4.2.0 - * @description - * - * Configures whether or not the home URL (`/`) generated by `src/pages/index.astro` - * will redirect to `/[defaultLocale]` when `prefixDefaultLocale: true` is set. - * - * Set `redirectToDefaultLocale: false` to disable this automatic redirection at the root of your site: - * ```js - * // astro.config.mjs - * export default defineConfig({ - * i18n:{ - * defaultLocale: "en", - * locales: ["en", "fr"], - * routing: { - * prefixDefaultLocale: true, - * redirectToDefaultLocale: false - * } - * } - * }) - *``` - * */ - redirectToDefaultLocale?: boolean; - - /** - * @name i18n.routing.strategy - * @type {"pathname"} - * @default `"pathname"` - * @version 3.7.0 + * @name i18n.routing.manual + * @type {string} + * @version 4.6.0 * @description + * When this option is enabled, Astro will **disable** its i18n middleware so that you can implement your own custom logic. No other `routing` options (e.g. `prefixDefaultLocale`) may be configured with `routing: "manual"`. * - * - `"pathname": The strategy is applied to the pathname of the URLs + * You will be responsible for writing your own routing logic, or executing Astro's i18n middleware manually alongside your own. */ - strategy?: 'pathname'; - }; + 'manual' + | { + /** + * @docs + * @name i18n.routing.prefixDefaultLocale + * @kind h4 + * @type {boolean} + * @default `false` + * @version 3.7.0 + * @description + * + * When `false`, only non-default languages will display a language prefix. + * The `defaultLocale` will not show a language prefix and content files do not exist in a localized folder. + * URLs will be of the form `example.com/[locale]/content/` for all non-default languages, but `example.com/content/` for the default locale. + * + * When `true`, all URLs will display a language prefix. + * URLs will be of the form `example.com/[locale]/content/` for every route, including the default language. + * Localized folders are used for every language, including the default. + */ + prefixDefaultLocale?: boolean; + + /** + * @docs + * @name i18n.routing.redirectToDefaultLocale + * @kind h4 + * @type {boolean} + * @default `true` + * @version 4.2.0 + * @description + * + * Configures whether or not the home URL (`/`) generated by `src/pages/index.astro` + * will redirect to `/[defaultLocale]` when `prefixDefaultLocale: true` is set. + * + * Set `redirectToDefaultLocale: false` to disable this automatic redirection at the root of your site: + * ```js + * // astro.config.mjs + * export default defineConfig({ + * i18n:{ + * defaultLocale: "en", + * locales: ["en", "fr"], + * routing: { + * prefixDefaultLocale: true, + * redirectToDefaultLocale: false + * } + * } + * }) + *``` + * */ + redirectToDefaultLocale?: boolean; + + /** + * @name i18n.routing.strategy + * @type {"pathname"} + * @default `"pathname"` + * @version 3.7.0 + * @description + * + * - `"pathname": The strategy is applied to the pathname of the URLs + */ + strategy?: 'pathname'; + }; /** * @name i18n.domains @@ -1589,7 +1603,7 @@ export interface AstroUserConfig { * }) * ``` * - * Both page routes built and URLs returned by the `astro:i18n` helper functions [`getAbsoluteLocaleUrl()`](https://docs.astro.build/en/guides/internationalization/#getabsolutelocaleurl) and [`getAbsoluteLocaleUrlList()`](https://docs.astro.build/en/guides/internationalization/#getabsolutelocaleurllist) will use the options set in `i18n.domains`. + * Both page routes built and URLs returned by the `astro:i18n` helper functions [`getAbsoluteLocaleUrl()`](https://docs.astro.build/en/reference/api-reference/#getabsolutelocaleurl) and [`getAbsoluteLocaleUrlList()`](https://docs.astro.build/en/reference/api-reference/#getabsolutelocaleurllist) will use the options set in `i18n.domains`. * * See the [Internationalization Guide](https://docs.astro.build/en/guides/internationalization/#domains) for more details, including the limitations of this feature. */ diff --git a/packages/astro/src/core/app/types.ts b/packages/astro/src/core/app/types.ts index e919e80e456f..fd56c6f1068f 100644 --- a/packages/astro/src/core/app/types.ts +++ b/packages/astro/src/core/app/types.ts @@ -68,7 +68,7 @@ export type SSRManifest = { }; export type SSRManifestI18n = { - fallback?: Record; + fallback: Record | undefined; strategy: RoutingStrategies; locales: Locales; defaultLocale: string; diff --git a/packages/astro/src/core/base-pipeline.ts b/packages/astro/src/core/base-pipeline.ts index f98eb4992070..832823db35fa 100644 --- a/packages/astro/src/core/base-pipeline.ts +++ b/packages/astro/src/core/base-pipeline.ts @@ -48,9 +48,13 @@ export abstract class Pipeline { */ readonly site = manifest.site ? new URL(manifest.site) : undefined ) { - this.internalMiddleware = [ - createI18nMiddleware(i18n, manifest.base, manifest.trailingSlash, manifest.buildFormat), - ]; + this.internalMiddleware = []; + // We do use our middleware only if the user isn't using the manual setup + if (i18n?.strategy !== 'manual') { + this.internalMiddleware.push( + createI18nMiddleware(i18n, manifest.base, manifest.trailingSlash, manifest.buildFormat) + ); + } } abstract headElements(routeData: RouteData): Promise | HeadElements; diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index e7ddc6de9ffa..a2c476572ab9 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -592,7 +592,7 @@ function createBuildManifest( if (settings.config.i18n) { i18nManifest = { fallback: settings.config.i18n.fallback, - strategy: toRoutingStrategy(settings.config.i18n), + strategy: toRoutingStrategy(settings.config.i18n.routing, settings.config.i18n.domains), defaultLocale: settings.config.i18n.defaultLocale, locales: settings.config.i18n.locales, domainLookupTable: {}, diff --git a/packages/astro/src/core/build/plugins/plugin-manifest.ts b/packages/astro/src/core/build/plugins/plugin-manifest.ts index 393442861d35..c1e87bf458d3 100644 --- a/packages/astro/src/core/build/plugins/plugin-manifest.ts +++ b/packages/astro/src/core/build/plugins/plugin-manifest.ts @@ -253,7 +253,7 @@ function buildManifest( if (settings.config.i18n) { i18nManifest = { fallback: settings.config.i18n.fallback, - strategy: toRoutingStrategy(settings.config.i18n), + strategy: toRoutingStrategy(settings.config.i18n.routing, settings.config.i18n.domains), locales: settings.config.i18n.locales, defaultLocale: settings.config.i18n.defaultLocale, domainLookupTable, diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index 58bea2f2b8f7..d9b91a9ce2c6 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -387,21 +387,25 @@ export const AstroConfigSchema = z.object({ .optional(), fallback: z.record(z.string(), z.string()).optional(), routing: z - .object({ - prefixDefaultLocale: z.boolean().default(false), - redirectToDefaultLocale: z.boolean().default(true), - strategy: z.enum(['pathname']).default('pathname'), - }) - .default({}) - .refine( - ({ prefixDefaultLocale, redirectToDefaultLocale }) => { - return !(prefixDefaultLocale === false && redirectToDefaultLocale === false); - }, - { - message: - 'The option `i18n.redirectToDefaultLocale` is only useful when the `i18n.prefixDefaultLocale` is set to `true`. Remove the option `i18n.redirectToDefaultLocale`, or change its value to `true`.', - } - ), + .literal('manual') + .or( + z + .object({ + prefixDefaultLocale: z.boolean().optional().default(false), + redirectToDefaultLocale: z.boolean().optional().default(true), + }) + .refine( + ({ prefixDefaultLocale, redirectToDefaultLocale }) => { + return !(prefixDefaultLocale === false && redirectToDefaultLocale === false); + }, + { + message: + 'The option `i18n.redirectToDefaultLocale` is only useful when the `i18n.prefixDefaultLocale` is set to `true`. Remove the option `i18n.redirectToDefaultLocale`, or change its value to `true`.', + } + ) + ) + .optional() + .default({}), }) .optional() .superRefine((i18n, ctx) => { diff --git a/packages/astro/src/core/errors/errors-data.ts b/packages/astro/src/core/errors/errors-data.ts index f8ba0352b695..e18221c428f1 100644 --- a/packages/astro/src/core/errors/errors-data.ts +++ b/packages/astro/src/core/errors/errors-data.ts @@ -1067,6 +1067,21 @@ export const MissingIndexForInternationalization = { hint: (src: string) => `Create an index page (\`index.astro, index.md, etc.\`) in \`${src}\`.`, } satisfies ErrorData; +/** + * @docs + * @description + * Some internationalization functions are only available when Astro's own i18n routing is disabled by the configuration setting `i18n.routing: "manual"`. + * + * @see + * - [`i18n` routing](https://docs.astro.build/en/guides/internationalization/#routing) + */ +export const IncorrectStrategyForI18n = { + name: 'IncorrectStrategyForI18n', + title: "You can't use the current function with the current strategy", + message: (functionName: string) => + `The function \`${functionName}\' can only be used when the \`i18n.routing.strategy\` is set to \`"manual"\`.`, +} satisfies ErrorData; + /** * @docs * @description @@ -1076,7 +1091,19 @@ export const NoPrerenderedRoutesWithDomains = { name: 'NoPrerenderedRoutesWithDomains', title: "Prerendered routes aren't supported when internationalization domains are enabled.", message: (component: string) => - `Static pages aren't yet supported with multiple domains. If you wish to enable this feature, you have to disable prerendering for the page ${component}`, + `Static pages aren't yet supported with multiple domains. To enable this feature, you must disable prerendering for the page ${component}`, +} satisfies ErrorData; + +/** + * @docs + * @description + * Astro throws an error if the user enables manual routing, but it doesn't have a middleware file. + */ +export const MissingMiddlewareForInternationalization = { + name: 'MissingMiddlewareForInternationalization', + title: 'Enabled manual internationalization routing without having a middleware.', + message: + "Your configuration setting `i18n.routing: 'manual'` requires you to provide your own i18n `middleware` file.", } satisfies ErrorData; /** diff --git a/packages/astro/src/core/middleware/vite-plugin.ts b/packages/astro/src/core/middleware/vite-plugin.ts index 64c039db7271..4472e16c2cd9 100644 --- a/packages/astro/src/core/middleware/vite-plugin.ts +++ b/packages/astro/src/core/middleware/vite-plugin.ts @@ -6,6 +6,8 @@ import { addRollupInput } from '../build/add-rollup-input.js'; import type { BuildInternals } from '../build/internal.js'; import type { StaticBuildOptions } from '../build/types.js'; import { MIDDLEWARE_PATH_SEGMENT_NAME } from '../constants.js'; +import { MissingMiddlewareForInternationalization } from '../errors/errors-data.js'; +import { AstroError } from '../errors/index.js'; export const MIDDLEWARE_MODULE_ID = '\0astro-internal:middleware'; const NOOP_MIDDLEWARE = '\0noop-middleware'; @@ -44,8 +46,14 @@ export function vitePluginMiddleware({ settings }: { settings: AstroSettings }): }, async load(id) { if (id === NOOP_MIDDLEWARE) { + if (!userMiddlewareIsPresent && settings.config.i18n?.routing === 'manual') { + throw new AstroError(MissingMiddlewareForInternationalization); + } return 'export const onRequest = (_, next) => next()'; } else if (id === MIDDLEWARE_MODULE_ID) { + if (!userMiddlewareIsPresent && settings.config.i18n?.routing === 'manual') { + throw new AstroError(MissingMiddlewareForInternationalization); + } // In the build, tell Vite to emit this file if (isCommandBuild) { this.emitFile({ diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts index 43395b930a98..6c3010ad6f95 100644 --- a/packages/astro/src/core/routing/manifest/create.ts +++ b/packages/astro/src/core/routing/manifest/create.ts @@ -589,7 +589,7 @@ export function createRouteManifest( const i18n = settings.config.i18n; if (i18n) { - const strategy = toRoutingStrategy(i18n); + const strategy = toRoutingStrategy(i18n.routing, i18n.domains); // First we check if the user doesn't have an index page. if (strategy === 'pathname-prefix-always') { let index = routes.find((route) => route.route === '/'); diff --git a/packages/astro/src/i18n/index.ts b/packages/astro/src/i18n/index.ts index 0b93f1d785b7..58cd1a20007d 100644 --- a/packages/astro/src/i18n/index.ts +++ b/packages/astro/src/i18n/index.ts @@ -1,9 +1,41 @@ import { appendForwardSlash, joinPaths } from '@astrojs/internal-helpers/path'; -import type { AstroConfig, Locales } from '../@types/astro.js'; +import type { + APIContext, + AstroConfig, + Locales, + SSRManifest, + ValidRedirectStatus, +} from '../@types/astro.js'; import { shouldAppendForwardSlash } from '../core/build/util.js'; import { MissingLocale } from '../core/errors/errors-data.js'; import { AstroError } from '../core/errors/index.js'; import type { RoutingStrategies } from './utils.js'; +import { createI18nMiddleware } from './middleware.js'; +import { REROUTE_DIRECTIVE_HEADER } from '../core/constants.js'; + +export function requestHasLocale(locales: Locales) { + return function (context: APIContext): boolean { + return pathHasLocale(context.url.pathname, locales); + }; +} + +// Checks if the pathname has any locale +export function pathHasLocale(path: string, locales: Locales): boolean { + const segments = path.split('/'); + for (const segment of segments) { + for (const locale of locales) { + if (typeof locale === 'string') { + if (normalizeTheLocale(segment) === normalizeTheLocale(locale)) { + return true; + } + } else if (segment === locale.path) { + return true; + } + } + } + + return false; +} type GetLocaleRelativeUrl = GetLocaleOptions & { locale: string; @@ -244,3 +276,117 @@ class Unreachable extends Error { ); } } + +export type MiddlewarePayload = { + base: string; + locales: Locales; + trailingSlash: AstroConfig['trailingSlash']; + format: AstroConfig['build']['format']; + strategy: RoutingStrategies; + defaultLocale: string; + domains: Record | undefined; + fallback: Record | undefined; +}; + +// NOTE: public function exported to the users via `astro:i18n` module +export function redirectToDefaultLocale({ + trailingSlash, + format, + base, + defaultLocale, +}: MiddlewarePayload) { + return function (context: APIContext, statusCode?: ValidRedirectStatus) { + if (shouldAppendForwardSlash(trailingSlash, format)) { + return context.redirect(`${appendForwardSlash(joinPaths(base, defaultLocale))}`, statusCode); + } else { + return context.redirect(`${joinPaths(base, defaultLocale)}`, statusCode); + } + }; +} + +// NOTE: public function exported to the users via `astro:i18n` module +export function notFound({ base, locales }: MiddlewarePayload) { + return function (context: APIContext, response?: Response): Response | undefined { + if (response?.headers.get(REROUTE_DIRECTIVE_HEADER) === 'no') return response; + + const url = context.url; + // We return a 404 if: + // - the current path isn't a root. e.g. / or / + // - the URL doesn't contain a locale + const isRoot = url.pathname === base + '/' || url.pathname === base; + if (!(isRoot || pathHasLocale(url.pathname, locales))) { + if (response) { + response.headers.set(REROUTE_DIRECTIVE_HEADER, 'no'); + return new Response(null, { + status: 404, + headers: response.headers, + }); + } else { + return new Response(null, { + status: 404, + headers: { + [REROUTE_DIRECTIVE_HEADER]: 'no', + }, + }); + } + } + + return undefined; + }; +} + +// NOTE: public function exported to the users via `astro:i18n` module +export type RedirectToFallback = (context: APIContext, response: Response) => Response; + +export function redirectToFallback({ + fallback, + locales, + defaultLocale, + strategy, +}: MiddlewarePayload) { + return function (context: APIContext, response: Response): Response { + if (response.status >= 300 && fallback) { + const fallbackKeys = fallback ? Object.keys(fallback) : []; + // we split the URL using the `/`, and then check in the returned array we have the locale + const segments = context.url.pathname.split('/'); + const urlLocale = segments.find((segment) => { + for (const locale of locales) { + if (typeof locale === 'string') { + if (locale === segment) { + return true; + } + } else if (locale.path === segment) { + return true; + } + } + return false; + }); + + if (urlLocale && fallbackKeys.includes(urlLocale)) { + const fallbackLocale = fallback[urlLocale]; + // the user might have configured the locale using the granular locales, so we want to retrieve its corresponding path instead + const pathFallbackLocale = getPathByLocale(fallbackLocale, locales); + let newPathname: string; + // If a locale falls back to the default locale, we want to **remove** the locale because + // the default locale doesn't have a prefix + if (pathFallbackLocale === defaultLocale && strategy === 'pathname-prefix-other-locales') { + newPathname = context.url.pathname.replace(`/${urlLocale}`, ``); + } else { + newPathname = context.url.pathname.replace(`/${urlLocale}`, `/${pathFallbackLocale}`); + } + return context.redirect(newPathname); + } + } + return response; + }; +} + +// NOTE: public function exported to the users via `astro:i18n` module +export function createMiddleware( + i18nManifest: SSRManifest['i18n'], + base: SSRManifest['base'], + trailingSlash: SSRManifest['trailingSlash'], + format: SSRManifest['buildFormat'] +) { + return createI18nMiddleware(i18nManifest, base, trailingSlash, format); +} diff --git a/packages/astro/src/i18n/middleware.ts b/packages/astro/src/i18n/middleware.ts index e03ba304498c..54aa1249f8fb 100644 --- a/packages/astro/src/i18n/middleware.ts +++ b/packages/astro/src/i18n/middleware.ts @@ -1,59 +1,52 @@ -import { appendForwardSlash, joinPaths } from '@astrojs/internal-helpers/path'; -import type { APIContext, Locales, MiddlewareHandler, SSRManifest } from '../@types/astro.js'; +import { + getPathByLocale, + type MiddlewarePayload, + notFound, + normalizeTheLocale, + requestHasLocale, + redirectToDefaultLocale, + redirectToFallback, +} from './index.js'; +import type { APIContext, MiddlewareHandler, SSRManifest } from '../@types/astro.js'; import type { SSRManifestI18n } from '../core/app/types.js'; -import { shouldAppendForwardSlash } from '../core/build/util.js'; -import { REROUTE_DIRECTIVE_HEADER, ROUTE_TYPE_HEADER } from '../core/constants.js'; -import { getPathByLocale, normalizeTheLocale } from './index.js'; - -// Checks if the pathname has any locale, exception for the defaultLocale, which is ignored on purpose. -function pathnameHasLocale(pathname: string, locales: Locales): boolean { - const segments = pathname.split('/'); - for (const segment of segments) { - for (const locale of locales) { - if (typeof locale === 'string') { - if (normalizeTheLocale(segment) === normalizeTheLocale(locale)) { - return true; - } - } else if (segment === locale.path) { - return true; - } - } - } - - return false; -} +import { ROUTE_TYPE_HEADER } from '../core/constants.js'; export function createI18nMiddleware( i18n: SSRManifest['i18n'], base: SSRManifest['base'], trailingSlash: SSRManifest['trailingSlash'], - buildFormat: SSRManifest['buildFormat'] + format: SSRManifest['buildFormat'] ): MiddlewareHandler { if (!i18n) return (_, next) => next(); + const payload: MiddlewarePayload = { + ...i18n, + trailingSlash, + base, + format, + domains: {}, + }; + const _redirectToDefaultLocale = redirectToDefaultLocale(payload); + const _noFoundForNonLocaleRoute = notFound(payload); + const _requestHasLocale = requestHasLocale(payload.locales); + const _redirectToFallback = redirectToFallback(payload); - const prefixAlways = ( - url: URL, - response: Response, - context: APIContext - ): Response | undefined => { + const prefixAlways = (context: APIContext): Response | undefined => { + const url = context.url; if (url.pathname === base + '/' || url.pathname === base) { - if (shouldAppendForwardSlash(trailingSlash, buildFormat)) { - return context.redirect(`${appendForwardSlash(joinPaths(base, i18n.defaultLocale))}`); - } else { - return context.redirect(`${joinPaths(base, i18n.defaultLocale)}`); - } + return _redirectToDefaultLocale(context); } // Astro can't know where the default locale is supposed to be, so it returns a 404. - else if (!pathnameHasLocale(url.pathname, i18n.locales)) { - return notFound(response); + else if (!_requestHasLocale(context)) { + return _noFoundForNonLocaleRoute(context); } return undefined; }; - const prefixOtherLocales = (url: URL, response: Response): Response | undefined => { + const prefixOtherLocales = (context: APIContext, response: Response): Response | undefined => { let pathnameContainsDefaultLocale = false; + const url = context.url; for (const segment of url.pathname.split('/')) { if (normalizeTheLocale(segment) === normalizeTheLocale(i18n.defaultLocale)) { pathnameContainsDefaultLocale = true; @@ -63,26 +56,7 @@ export function createI18nMiddleware( if (pathnameContainsDefaultLocale) { const newLocation = url.pathname.replace(`/${i18n.defaultLocale}`, ''); response.headers.set('Location', newLocation); - return notFound(response); - } - - return undefined; - }; - - /** - * We return a 404 if: - * - the current path isn't a root. e.g. / or / - * - the URL doesn't contain a locale - * @param url - * @param response - */ - const prefixAlwaysNoRedirect = (url: URL, response: Response): Response | undefined => { - // We return a 404 if: - // - the current path isn't a root. e.g. / or / - // - the URL doesn't contain a locale - const isRoot = url.pathname === base + '/' || url.pathname === base; - if (!(isRoot || pathnameHasLocale(url.pathname, i18n.locales))) { - return notFound(response); + return _noFoundForNonLocaleRoute(context); } return undefined; @@ -96,13 +70,16 @@ export function createI18nMiddleware( return response; } - const { url, currentLocale } = context; - const { locales, defaultLocale, fallback, strategy } = i18n; + const { currentLocale } = context; switch (i18n.strategy) { + // NOTE: theoretically, we should never hit this code path + case 'manual': { + return response; + } case 'domains-prefix-other-locales': { if (localeHasntDomain(i18n, currentLocale)) { - const result = prefixOtherLocales(url, response); + const result = prefixOtherLocales(context, response); if (result) { return result; } @@ -110,7 +87,7 @@ export function createI18nMiddleware( break; } case 'pathname-prefix-other-locales': { - const result = prefixOtherLocales(url, response); + const result = prefixOtherLocales(context, response); if (result) { return result; } @@ -119,7 +96,7 @@ export function createI18nMiddleware( case 'domains-prefix-always-no-redirect': { if (localeHasntDomain(i18n, currentLocale)) { - const result = prefixAlwaysNoRedirect(url, response); + const result = _noFoundForNonLocaleRoute(context, response); if (result) { return result; } @@ -128,7 +105,7 @@ export function createI18nMiddleware( } case 'pathname-prefix-always-no-redirect': { - const result = prefixAlwaysNoRedirect(url, response); + const result = _noFoundForNonLocaleRoute(context, response); if (result) { return result; } @@ -136,7 +113,7 @@ export function createI18nMiddleware( } case 'pathname-prefix-always': { - const result = prefixAlways(url, response, context); + const result = prefixAlways(context); if (result) { return result; } @@ -144,7 +121,7 @@ export function createI18nMiddleware( } case 'domains-prefix-always': { if (localeHasntDomain(i18n, currentLocale)) { - const result = prefixAlways(url, response, context); + const result = prefixAlways(context); if (result) { return result; } @@ -153,58 +130,10 @@ export function createI18nMiddleware( } } - if (response.status >= 300 && fallback) { - const fallbackKeys = i18n.fallback ? Object.keys(i18n.fallback) : []; - - // we split the URL using the `/`, and then check in the returned array we have the locale - const segments = url.pathname.split('/'); - const urlLocale = segments.find((segment) => { - for (const locale of locales) { - if (typeof locale === 'string') { - if (locale === segment) { - return true; - } - } else if (locale.path === segment) { - return true; - } - } - return false; - }); - - if (urlLocale && fallbackKeys.includes(urlLocale)) { - const fallbackLocale = fallback[urlLocale]; - // the user might have configured the locale using the granular locales, so we want to retrieve its corresponding path instead - const pathFallbackLocale = getPathByLocale(fallbackLocale, locales); - let newPathname: string; - // If a locale falls back to the default locale, we want to **remove** the locale because - // the default locale doesn't have a prefix - if (pathFallbackLocale === defaultLocale && strategy === 'pathname-prefix-other-locales') { - newPathname = url.pathname.replace(`/${urlLocale}`, ``); - } else { - newPathname = url.pathname.replace(`/${urlLocale}`, `/${pathFallbackLocale}`); - } - - return context.redirect(newPathname); - } - } - - return response; + return _redirectToFallback(context, response); }; } -/** - * The i18n returns empty 404 responses in certain cases. - * Error-page-rerouting infra will attempt to render the 404.astro page, causing the middleware to run a second time. - * To avoid loops and overwriting the contents of `404.astro`, we allow error pages to pass through. - */ -function notFound(response: Response) { - if (response.headers.get(REROUTE_DIRECTIVE_HEADER) === 'no') return response; - return new Response(null, { - status: 404, - headers: response.headers, - }); -} - /** * Checks if the current locale doesn't belong to a configured domain * @param i18n diff --git a/packages/astro/src/i18n/utils.ts b/packages/astro/src/i18n/utils.ts index bda5e764d392..5d9de5c43e5b 100644 --- a/packages/astro/src/i18n/utils.ts +++ b/packages/astro/src/i18n/utils.ts @@ -178,35 +178,42 @@ export function computeCurrentLocale(pathname: string, locales: Locales): undefi } export type RoutingStrategies = + | 'manual' | 'pathname-prefix-always' | 'pathname-prefix-other-locales' | 'pathname-prefix-always-no-redirect' | 'domains-prefix-always' | 'domains-prefix-other-locales' | 'domains-prefix-always-no-redirect'; -export function toRoutingStrategy(i18n: NonNullable) { - let { routing, domains } = i18n; +export function toRoutingStrategy( + routing: NonNullable['routing'], + domains: NonNullable['domains'] +) { let strategy: RoutingStrategies; const hasDomains = domains ? Object.keys(domains).length > 0 : false; - if (!hasDomains) { - if (routing?.prefixDefaultLocale === true) { - if (routing.redirectToDefaultLocale) { - strategy = 'pathname-prefix-always'; + if (routing === 'manual') { + strategy = 'manual'; + } else { + if (!hasDomains) { + if (routing?.prefixDefaultLocale === true) { + if (routing.redirectToDefaultLocale) { + strategy = 'pathname-prefix-always'; + } else { + strategy = 'pathname-prefix-always-no-redirect'; + } } else { - strategy = 'pathname-prefix-always-no-redirect'; + strategy = 'pathname-prefix-other-locales'; } } else { - strategy = 'pathname-prefix-other-locales'; - } - } else { - if (routing?.prefixDefaultLocale === true) { - if (routing.redirectToDefaultLocale) { - strategy = 'domains-prefix-always'; + if (routing?.prefixDefaultLocale === true) { + if (routing.redirectToDefaultLocale) { + strategy = 'domains-prefix-always'; + } else { + strategy = 'domains-prefix-always-no-redirect'; + } } else { - strategy = 'domains-prefix-always-no-redirect'; + strategy = 'domains-prefix-other-locales'; } - } else { - strategy = 'domains-prefix-other-locales'; } } diff --git a/packages/astro/src/virtual-modules/i18n.ts b/packages/astro/src/virtual-modules/i18n.ts index 01b93ade4fda..0714c08b7949 100644 --- a/packages/astro/src/virtual-modules/i18n.ts +++ b/packages/astro/src/virtual-modules/i18n.ts @@ -1,18 +1,36 @@ import * as I18nInternals from '../i18n/index.js'; import { toRoutingStrategy } from '../i18n/utils.js'; +import { AstroError } from '../core/errors/index.js'; +import { IncorrectStrategyForI18n } from '../core/errors/errors-data.js'; +import type { RedirectToFallback } from '../i18n/index.js'; +import type { SSRManifest } from '../core/app/types.js'; +import type { + APIContext, + AstroConfig, + MiddlewareHandler, + ValidRedirectStatus, +} from '../@types/astro.js'; import type { I18nInternalConfig } from '../i18n/vite-plugin-i18n.js'; export { normalizeTheLocale, toCodes, toPaths } from '../i18n/index.js'; const { trailingSlash, format, site, i18n, isBuild } = // @ts-expect-error __ASTRO_INTERNAL_I18N_CONFIG__ as I18nInternalConfig; -const { defaultLocale, locales, domains } = i18n!; +const { defaultLocale, locales, domains, fallback, routing } = i18n!; const base = import.meta.env.BASE_URL; -const routing = toRoutingStrategy(i18n!); +const strategy = toRoutingStrategy(routing, domains); export type GetLocaleOptions = I18nInternals.GetLocaleOptions; +const noop = (method: string) => + function () { + throw new AstroError({ + ...IncorrectStrategyForI18n, + message: IncorrectStrategyForI18n.message(method), + }); + }; + /** * @param locale A locale * @param path An optional path to add after the `locale`. @@ -43,7 +61,7 @@ export const getRelativeLocaleUrl = (locale: string, path?: string, options?: Ge format, defaultLocale, locales, - strategy: routing, + strategy, domains, ...options, }); @@ -83,7 +101,7 @@ export const getAbsoluteLocaleUrl = (locale: string, path?: string, options?: Ge site, defaultLocale, locales, - strategy: routing, + strategy, domains, isBuild, ...options, @@ -103,7 +121,7 @@ export const getRelativeLocaleUrlList = (path?: string, options?: GetLocaleOptio format, defaultLocale, locales, - strategy: routing, + strategy, domains, ...options, }); @@ -123,7 +141,7 @@ export const getAbsoluteLocaleUrlList = (path?: string, options?: GetLocaleOptio format, defaultLocale, locales, - strategy: routing, + strategy, domains, isBuild, ...options, @@ -191,3 +209,177 @@ export const getPathByLocale = (locale: string) => I18nInternals.getPathByLocale * ``` */ export const getLocaleByPath = (path: string) => I18nInternals.getLocaleByPath(path, locales); + +/** + * A function that can be used to check if the current path contains a configured locale. + * + * @param path The path that maps to a locale + * @returns Whether the `path` has the locale + * + * ## Example + * + * Given the following configuration: + * + * ```js + * // astro.config.mjs + * + * export default defineConfig({ + * i18n: { + * locales: [ + * { codes: ["it-VT", "it"], path: "italiano" }, + * "es" + * ] + * } + * }) + * ``` + * + * Here's some use cases: + * + * ```js + * import { pathHasLocale } from "astro:i18n"; + * getLocaleByPath("italiano"); // returns `true` + * getLocaleByPath("es"); // returns `true` + * getLocaleByPath("it-VT"); // returns `false` + * ``` + */ +export const pathHasLocale = (path: string) => I18nInternals.pathHasLocale(path, locales); + +/** + * + * This function returns a redirect to the default locale configured in the + * + * @param {APIContext} context The context passed to the middleware + * @param {ValidRedirectStatus?} statusCode An optional status code for the redirect. + */ +export let redirectToDefaultLocale: ( + context: APIContext, + statusCode?: ValidRedirectStatus +) => Response | undefined; + +if (i18n?.routing === 'manual') { + redirectToDefaultLocale = I18nInternals.redirectToDefaultLocale({ + base, + trailingSlash, + format, + defaultLocale, + locales, + strategy, + domains, + fallback, + }); +} else { + redirectToDefaultLocale = noop('redirectToDefaultLocale'); +} +/** + * + * Use this function to return a 404 when: + * - the current path isn't a root. e.g. / or / + * - the URL doesn't contain a locale + * + * When a `Response` is passed, the new `Response` emitted by this function will contain the same headers of the original response. + * + * @param {APIContext} context The context passed to the middleware + * @param {Response?} response An optional `Response` in case you're handling a `Response` coming from the `next` function. + * + */ +export let notFound: (context: APIContext, response?: Response) => Response | undefined; + +if (i18n?.routing === 'manual') { + notFound = I18nInternals.notFound({ + base, + trailingSlash, + format, + defaultLocale, + locales, + strategy, + domains, + fallback, + }); +} else { + notFound = noop('notFound'); +} + +/** + * Checks whether the current URL contains a configured locale. Internally, this function will use `APIContext#url.pathname` + * + * @param {APIContext} context The context passed to the middleware + */ +export let requestHasLocale: (context: APIContext) => boolean; + +if (i18n?.routing === 'manual') { + requestHasLocale = I18nInternals.requestHasLocale(locales); +} else { + requestHasLocale = noop('requestHasLocale'); +} + +/** + * Allows to use the build-in fallback system of Astro + * + * @param {APIContext} context The context passed to the middleware + * @param {Response} response An optional `Response` in case you're handling a `Response` coming from the `next` function. + */ +export let redirectToFallback: RedirectToFallback; + +if (i18n?.routing === 'manual') { + redirectToFallback = I18nInternals.redirectToFallback({ + base, + trailingSlash, + format, + defaultLocale, + locales, + strategy, + domains, + fallback, + }); +} else { + redirectToFallback = noop('useFallback'); +} + +type OnlyObject = T extends object ? T : never; +type NewAstroRoutingConfigWithoutManual = OnlyObject['routing']>; + +/** + * @param {AstroConfig['i18n']['routing']} customOptions + * + * A function that allows to programmatically create the Astro i18n middleware. + * + * This is use useful when you still want to use the default i18n logic, but add only few exceptions to your website. + * + * ## Examples + * + * ```js + * // middleware.js + * import { middleware } from "astro:i18n"; + * import { sequence, defineMiddleware } from "astro:middleware"; + * + * const customLogic = defineMiddleware(async (context, next) => { + * const response = await next(); + * + * // Custom logic after resolving the response. + * // It's possible to catch the response coming from Astro i18n middleware. + * + * return response; + * }); + * + * export const onRequest = sequence(customLogic, middleware({ + * prefixDefaultLocale: true, + * redirectToDefaultLocale: false + * })) + * + * ``` + */ +export let middleware: (customOptions: NewAstroRoutingConfigWithoutManual) => MiddlewareHandler; + +if (i18n?.routing === 'manual') { + middleware = (customOptions: NewAstroRoutingConfigWithoutManual) => { + const manifest: SSRManifest['i18n'] = { + ...i18n, + fallback: undefined, + strategy: toRoutingStrategy(customOptions, {}), + domainLookupTable: {}, + }; + return I18nInternals.createMiddleware(manifest, base, trailingSlash, format); + }; +} else { + middleware = noop('middleware'); +} diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index 3d2889735b0d..082de6bcebf0 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -121,7 +121,7 @@ export function createDevelopmentManifest(settings: AstroSettings): SSRManifest if (settings.config.i18n) { i18nManifest = { fallback: settings.config.i18n.fallback, - strategy: toRoutingStrategy(settings.config.i18n), + strategy: toRoutingStrategy(settings.config.i18n.routing, settings.config.i18n.domains), defaultLocale: settings.config.i18n.defaultLocale, locales: settings.config.i18n.locales, domainLookupTable: {}, diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index 3228641489fb..21053420a754 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -168,6 +168,7 @@ export async function handleRoute({ let options: SSROptions | undefined = undefined; let route: RouteData; const middleware = (await loadMiddleware(loader)).onRequest; + const locals = Reflect.get(incomingRequest, clientLocalsSymbol); if (!matchedRoute) { if (config.i18n) { @@ -235,7 +236,6 @@ export async function handleRoute({ const { preloadedComponent } = matchedRoute; route = matchedRoute.route; // Allows adapters to pass in locals in dev mode. - const locals = Reflect.get(incomingRequest, clientLocalsSymbol); request = createRequest({ base: config.base, url, diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs new file mode 100644 index 000000000000..0638988f063b --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs @@ -0,0 +1,14 @@ +import { defineConfig} from "astro/config"; + +export default defineConfig({ + i18n: { + defaultLocale: 'en', + locales: [ + 'en', 'pt', 'it', { + path: "spanish", + codes: ["es", "es-ar"] + } + ], + routing: "manual" + } +}) diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/package.json b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/package.json new file mode 100644 index 000000000000..8230d254b88d --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/i18n-manual-with-default-middleware", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js new file mode 100644 index 000000000000..d45754902b2b --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js @@ -0,0 +1,22 @@ +import { defineMiddleware, sequence } from 'astro:middleware'; +import { middleware } from 'astro:i18n'; + +const customLogic = defineMiddleware(async (context, next) => { + const url = new URL(context.request.url); + if (url.pathname.startsWith('/about')) { + return new Response('ABOUT ME', { + status: 200, + }); + } + + const response = await next(); + + return response; +}); + +export const onRequest = sequence( + customLogic, + middleware({ + prefixDefaultLocale: true, + }) +); diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/about.astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/about.astro new file mode 100644 index 000000000000..b5cb264b5f34 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/about.astro @@ -0,0 +1,8 @@ + + + Astro + + + + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/blog.astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/blog.astro new file mode 100644 index 000000000000..f40d52dad178 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/blog.astro @@ -0,0 +1,8 @@ + + + Astro + + +Blog should not render + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/blog/[id].astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/blog/[id].astro new file mode 100644 index 000000000000..97b41230d6e9 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/blog/[id].astro @@ -0,0 +1,18 @@ +--- +export function getStaticPaths() { + return [ + {params: {id: '1'}, props: { content: "Hello world" }}, + {params: {id: '2'}, props: { content: "Eat Something" }}, + {params: {id: '3'}, props: { content: "How are you?" }}, + ]; +} +const { content } = Astro.props; +--- + + + Astro + + +{content} + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/start.astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/start.astro new file mode 100644 index 000000000000..d9f61aa025c1 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/en/start.astro @@ -0,0 +1,8 @@ + + + Astro + + +Hello + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/index.astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/index.astro new file mode 100644 index 000000000000..05faf7b0bcce --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/index.astro @@ -0,0 +1,8 @@ + + + Astro + + + Hello + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/blog/[id].astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/blog/[id].astro new file mode 100644 index 000000000000..e37f83a30243 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/blog/[id].astro @@ -0,0 +1,18 @@ +--- +export function getStaticPaths() { + return [ + {params: {id: '1'}, props: { content: "Hola mundo" }}, + {params: {id: '2'}, props: { content: "Eat Something" }}, + {params: {id: '3'}, props: { content: "How are you?" }}, + ]; +} +const { content } = Astro.props; +--- + + + Astro + + +{content} + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/start.astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/start.astro new file mode 100644 index 000000000000..9a37428ca626 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/pt/start.astro @@ -0,0 +1,12 @@ +--- +const currentLocale = Astro.currentLocale; +--- + + + Astro + + +Hola +Current Locale: {currentLocale ? currentLocale : "none"} + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/spanish/index.astro b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/spanish/index.astro new file mode 100644 index 000000000000..a36031be6ec0 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/pages/spanish/index.astro @@ -0,0 +1,14 @@ +--- +const currentLocale = Astro.currentLocale; + +--- + + + + Astro + + +Hola. +Current Locale: {currentLocale ? currentLocale : "none"} + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/astro.config.mjs b/packages/astro/test/fixtures/i18n-routing-manual/astro.config.mjs new file mode 100644 index 000000000000..0638988f063b --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/astro.config.mjs @@ -0,0 +1,14 @@ +import { defineConfig} from "astro/config"; + +export default defineConfig({ + i18n: { + defaultLocale: 'en', + locales: [ + 'en', 'pt', 'it', { + path: "spanish", + codes: ["es", "es-ar"] + } + ], + routing: "manual" + } +}) diff --git a/packages/astro/test/fixtures/i18n-routing-manual/package.json b/packages/astro/test/fixtures/i18n-routing-manual/package.json new file mode 100644 index 000000000000..b79591a69645 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/i18n-routing-manual", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js b/packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js new file mode 100644 index 000000000000..29634e3ffea1 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js @@ -0,0 +1,20 @@ +import { defineMiddleware } from 'astro:middleware'; +import { redirectToDefaultLocale, requestHasLocale } from 'astro:i18n'; + +const allowList = new Set(['/help', '/help/']); + +export const onRequest = defineMiddleware(async (context, next) => { + if (allowList.has(context.url.pathname)) { + return await next(); + } + if (requestHasLocale(context)) { + return await next(); + } + + if (context.url.pathname === '/') { + return redirectToDefaultLocale(context); + } + return new Response(null, { + status: 404, + }); +}); diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/[id].astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/[id].astro new file mode 100644 index 000000000000..97b41230d6e9 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/[id].astro @@ -0,0 +1,18 @@ +--- +export function getStaticPaths() { + return [ + {params: {id: '1'}, props: { content: "Hello world" }}, + {params: {id: '2'}, props: { content: "Eat Something" }}, + {params: {id: '3'}, props: { content: "How are you?" }}, + ]; +} +const { content } = Astro.props; +--- + + + Astro + + +{content} + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/index.astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/index.astro new file mode 100644 index 000000000000..edb95dc8da71 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/blog/index.astro @@ -0,0 +1,8 @@ + + + Astro + + +Blog start + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/index.astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/index.astro new file mode 100644 index 000000000000..d9f61aa025c1 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/index.astro @@ -0,0 +1,8 @@ + + + Astro + + +Hello + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/start.astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/start.astro new file mode 100644 index 000000000000..d9f61aa025c1 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/en/start.astro @@ -0,0 +1,8 @@ + + + Astro + + +Hello + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/help.astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/help.astro new file mode 100644 index 000000000000..f0c02bccf29e --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/help.astro @@ -0,0 +1,11 @@ +--- + +--- + + + Astro + + + Outside route + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/index.astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/index.astro new file mode 100644 index 000000000000..d9f61aa025c1 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/index.astro @@ -0,0 +1,8 @@ + + + Astro + + +Hello + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/blog/[id].astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/blog/[id].astro new file mode 100644 index 000000000000..e37f83a30243 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/blog/[id].astro @@ -0,0 +1,18 @@ +--- +export function getStaticPaths() { + return [ + {params: {id: '1'}, props: { content: "Hola mundo" }}, + {params: {id: '2'}, props: { content: "Eat Something" }}, + {params: {id: '3'}, props: { content: "How are you?" }}, + ]; +} +const { content } = Astro.props; +--- + + + Astro + + +{content} + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/start.astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/start.astro new file mode 100644 index 000000000000..8e6455be4d76 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/pt/start.astro @@ -0,0 +1,12 @@ +--- +const currentLocale = Astro.currentLocale; +--- + + + Astro + + +Oi +Current Locale: {currentLocale ? currentLocale : "none"} + + diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/pages/spanish/index.astro b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/spanish/index.astro new file mode 100644 index 000000000000..a36031be6ec0 --- /dev/null +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/pages/spanish/index.astro @@ -0,0 +1,14 @@ +--- +const currentLocale = Astro.currentLocale; + +--- + + + + Astro + + +Hola. +Current Locale: {currentLocale ? currentLocale : "none"} + + diff --git a/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js b/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js new file mode 100644 index 000000000000..2a80b04b9577 --- /dev/null +++ b/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js @@ -0,0 +1,96 @@ +import { describe, it, before, after } from 'node:test'; +import assert from 'node:assert/strict'; +import { loadFixture } from './test-utils.js'; +import * as cheerio from 'cheerio'; +import testAdapter from './test-adapter.js'; + +// DEV +describe('Dev server manual routing', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + /** @type {import('./test-utils').DevServer} */ + let devServer; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/i18n-routing-manual-with-default-middleware/', + }); + devServer = await fixture.startDevServer(); + }); + + after(async () => { + await devServer.stop(); + }); + + it('should return a 404', async () => { + const response = await fixture.fetch('/blog'); + const text = await response.text(); + assert.equal(response.status, 404); + assert.equal(text.includes('Blog should not render'), false); + }); + + it('should return a 200 because the custom middleware allows it', async () => { + const response = await fixture.fetch('/about'); + assert.equal(response.status, 200); + const text = await response.text(); + assert.equal(text.includes('ABOUT ME'), true); + }); +}); +// +// // SSG +describe('SSG manual routing', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/i18n-routing-manual-with-default-middleware/', + }); + await fixture.build(); + }); + + it('should return a 404', async () => { + try { + await fixture.readFile('/blog.html'); + assert.fail(); + } catch (e) {} + }); + + it('should return a 200 because the custom middleware allows it', async () => { + let html = await fixture.readFile('/about/index.html'); + let $ = cheerio.load(html); + assert.equal($('body').text().includes('ABOUT ME'), true); + }); +}); + +// // SSR +describe('SSR manual routing', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + let app; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/i18n-routing-manual-with-default-middleware/', + output: 'server', + adapter: testAdapter(), + }); + await fixture.build(); + app = await fixture.loadTestAdapterApp(); + }); + + it('should return a 404', async () => { + let request = new Request('http://example.com/blog'); + let response = await app.render(request); + assert.equal(response.status, 404); + assert.equal((await response.text()).includes('Blog should not render'), false); + }); + + it('should return a 200 because the custom middleware allows it', async () => { + let request = new Request('http://example.com/about'); + let response = await app.render(request); + assert.equal(response.status, 200); + const text = await response.text(); + assert.equal(text.includes('ABOUT ME'), true); + }); +}); diff --git a/packages/astro/test/i18n-routing-manual.test.js b/packages/astro/test/i18n-routing-manual.test.js new file mode 100644 index 000000000000..24f9c187e874 --- /dev/null +++ b/packages/astro/test/i18n-routing-manual.test.js @@ -0,0 +1,147 @@ +import { describe, it, before, after } from 'node:test'; +import assert from 'node:assert/strict'; +import { loadFixture } from './test-utils.js'; +import * as cheerio from 'cheerio'; +import testAdapter from './test-adapter.js'; + +// DEV +describe('Dev server manual routing', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + /** @type {import('./test-utils').DevServer} */ + let devServer; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/i18n-routing-manual/', + }); + devServer = await fixture.startDevServer(); + }); + + after(async () => { + await devServer.stop(); + }); + + it('should redirect to the default locale when middleware calls the function for route /', async () => { + const response = await fixture.fetch('/'); + assert.equal(response.status, 200); + const text = await response.text(); + assert.equal(text.includes('Hello'), true); + }); + + it('should render a route that is not related to the i18n routing', async () => { + const response = await fixture.fetch('/help'); + assert.equal(response.status, 200); + const text = await response.text(); + assert.equal(text.includes('Outside route'), true); + }); + + it('should render a i18n route', async () => { + let response = await fixture.fetch('/en/blog'); + assert.equal(response.status, 200); + let text = await response.text(); + assert.equal(text.includes('Blog start'), true); + + response = await fixture.fetch('/pt/start'); + assert.equal(response.status, 200); + text = await response.text(); + assert.equal(text.includes('Oi'), true); + + response = await fixture.fetch('/spanish'); + assert.equal(response.status, 200); + text = await response.text(); + assert.equal(text.includes('Hola.'), true); + }); +}); + +// SSG +describe('SSG manual routing', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + /** @type {import('./test-utils').DevServer} */ + let devServer; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/i18n-routing-manual/', + }); + await fixture.build(); + }); + + it('should redirect to the default locale when middleware calls the function for route /', async () => { + let html = await fixture.readFile('/index.html'); + assert.equal(html.includes('http-equiv="refresh'), true); + assert.equal(html.includes('url=/en'), true); + }); + + it('should render a route that is not related to the i18n routing', async () => { + let html = await fixture.readFile('/help/index.html'); + let $ = cheerio.load(html); + assert.equal($('body').text().includes('Outside route'), true); + }); + + it('should render a i18n route', async () => { + let html = await fixture.readFile('/en/blog/index.html'); + let $ = cheerio.load(html); + assert.equal($('body').text().includes('Blog start'), true); + + html = await fixture.readFile('/pt/start/index.html'); + $ = cheerio.load(html); + assert.equal($('body').text().includes('Oi'), true); + + html = await fixture.readFile('/spanish/index.html'); + $ = cheerio.load(html); + assert.equal($('body').text().includes('Hola.'), true); + }); +}); + +// SSR +describe('SSR manual routing', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + let app; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/i18n-routing-manual/', + output: 'server', + adapter: testAdapter(), + }); + await fixture.build(); + app = await fixture.loadTestAdapterApp(); + }); + + it('should redirect to the default locale when middleware calls the function for route /', async () => { + let request = new Request('http://example.com/'); + let response = await app.render(request); + assert.equal(response.status, 302); + }); + + it('should render a route that is not related to the i18n routing', async () => { + let request = new Request('http://example.com/help'); + let response = await app.render(request); + assert.equal(response.status, 200); + const text = await response.text(); + assert.equal(text.includes('Outside route'), true); + }); + + it('should render a i18n route', async () => { + let request = new Request('http://example.com/en/blog'); + let response = await app.render(request); + assert.equal(response.status, 200); + let text = await response.text(); + assert.equal(text.includes('Blog start'), true); + + request = new Request('http://example.com/pt/start'); + response = await app.render(request); + assert.equal(response.status, 200); + text = await response.text(); + assert.equal(text.includes('Oi'), true); + + request = new Request('http://example.com/spanish'); + response = await app.render(request); + assert.equal(response.status, 200); + text = await response.text(); + assert.equal(text.includes('Hola.'), true); + }); +}); diff --git a/packages/astro/test/i18n-routing.test.js b/packages/astro/test/i18n-routing.test.js index 58a609bedb61..6e1503819b40 100644 --- a/packages/astro/test/i18n-routing.test.js +++ b/packages/astro/test/i18n-routing.test.js @@ -773,7 +773,6 @@ describe('[SSG] i18n routing', () => { it('should redirect to the index of the default locale', async () => { const html = await fixture.readFile('/index.html'); assert.equal(html.includes('http-equiv="refresh'), true); - assert.equal(html.includes('http-equiv="refresh'), true); assert.equal(html.includes('url=/new-site/en'), true); }); diff --git a/packages/astro/test/units/i18n/astro_i18n.test.js b/packages/astro/test/units/i18n/astro_i18n.test.js index 6622308cc539..b55d2db21d98 100644 --- a/packages/astro/test/units/i18n/astro_i18n.test.js +++ b/packages/astro/test/units/i18n/astro_i18n.test.js @@ -245,7 +245,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/en-us/' ); @@ -258,7 +258,7 @@ describe('getLocaleRelativeUrl', () => { trailingSlash: 'always', format: 'directory', normalizeLocale: false, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/en_US/' ); @@ -270,7 +270,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/en-au/' ); @@ -300,7 +300,7 @@ describe('getLocaleRelativeUrl', () => { trailingSlash: 'always', format: 'directory', ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/en/' ); @@ -311,7 +311,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/es/' ); @@ -324,7 +324,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/en/' ); @@ -335,7 +335,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/es/' ); @@ -366,7 +366,7 @@ describe('getLocaleRelativeUrl', () => { trailingSlash: 'always', format: 'directory', ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/en/' ); @@ -377,7 +377,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/es/' ); @@ -390,7 +390,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/en/' ); @@ -401,7 +401,7 @@ describe('getLocaleRelativeUrl', () => { ...config.i18n, trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), '/blog/es/' ); @@ -603,7 +603,7 @@ describe('getLocaleRelativeUrlList', () => { ...config.i18n, trailingSlash: 'never', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), ['/blog/en', '/blog/en-us', '/blog/es'] ); @@ -632,7 +632,7 @@ describe('getLocaleRelativeUrlList', () => { ...config.i18n, trailingSlash: 'never', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), ['/blog/en', '/blog/en-us', '/blog/es'] ); @@ -830,7 +830,7 @@ describe('getLocaleAbsoluteUrl', () => { format: 'directory', site: 'https://example.com', ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en/' ); @@ -843,7 +843,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'always', format: 'directory', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -857,7 +857,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'always', format: 'file', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en/' ); @@ -869,7 +869,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'always', format: 'file', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -883,7 +883,7 @@ describe('getLocaleAbsoluteUrl', () => { format: 'file', site: 'https://example.com', isBuild: true, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://es.example.com/blog/' ); @@ -899,7 +899,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', path: 'first-post', isBuild: true, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://es.example.com/blog/some-name/first-post/' ); @@ -927,7 +927,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'always', format: 'directory', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/en/' ); @@ -939,7 +939,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'always', format: 'directory', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/es/' ); @@ -968,7 +968,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'never', format: 'directory', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en' ); @@ -980,7 +980,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'always', format: 'directory', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -993,7 +993,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'ignore', format: 'directory', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en/' ); @@ -1007,7 +1007,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'never', format: 'file', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en' ); @@ -1019,7 +1019,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'always', format: 'file', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -1033,7 +1033,7 @@ describe('getLocaleAbsoluteUrl', () => { trailingSlash: 'ignore', format: 'file', site: 'https://example.com', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en' ); @@ -1115,7 +1115,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', format: 'directory', ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en/' ); @@ -1127,7 +1127,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', trailingSlash: 'always', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -1141,7 +1141,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en/' ); @@ -1153,7 +1153,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -1185,7 +1185,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', format: 'directory', ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en/' ); @@ -1197,7 +1197,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', trailingSlash: 'always', format: 'directory', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -1211,7 +1211,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/en/' ); @@ -1223,7 +1223,7 @@ describe('getLocaleAbsoluteUrl', () => { site: 'https://example.com', trailingSlash: 'always', format: 'file', - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), 'https://example.com/blog/es/' ); @@ -1530,7 +1530,7 @@ describe('getLocaleAbsoluteUrlList', () => { path: 'download', ...config, ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), }), [ 'https://example.com/en/download/', @@ -1570,7 +1570,7 @@ describe('getLocaleAbsoluteUrlList', () => { path: 'download', ...config, ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), isBuild: true, }), [ @@ -1726,7 +1726,7 @@ describe('getLocaleAbsoluteUrlList', () => { locale: 'en', base: '/blog/', ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), trailingSlash: 'ignore', format: 'directory', site: 'https://example.com', @@ -1760,7 +1760,7 @@ describe('getLocaleAbsoluteUrlList', () => { locale: 'en', base: '/blog/', ...config.i18n, - strategy: toRoutingStrategy(config.i18n), + strategy: toRoutingStrategy(config.i18n.routing, {}), trailingSlash: 'ignore', format: 'directory', site: 'https://example.com', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49a565827545..2061cfefe5f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2921,6 +2921,18 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/i18n-routing-manual: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + + packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/i18n-routing-prefix-always: dependencies: astro: diff --git a/scripts/cmd/test.js b/scripts/cmd/test.js index 87b34987ab28..04f02f73afc0 100644 --- a/scripts/cmd/test.js +++ b/scripts/cmd/test.js @@ -7,7 +7,7 @@ import arg from 'arg'; import glob from 'tiny-glob'; const isCI = !!process.env.CI; -const defaultTimeout = isCI ? 1200000 : 600000; +const defaultTimeout = isCI ? 1400000 : 600000; export default async function test() { const args = arg({ From e064f7c8ff2b613dd1f0057d13bdca0ea4784306 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 10 Apr 2024 14:39:33 +0000 Subject: [PATCH 39/96] [ci] format --- packages/astro/src/i18n/index.ts | 4 ++-- packages/astro/src/i18n/middleware.ts | 12 ++++++------ packages/astro/src/virtual-modules/i18n.ts | 12 ++++++------ .../src/middleware.js | 2 +- .../fixtures/i18n-routing-manual/src/middleware.js | 2 +- ...8n-routing-manual-with-default-middleware.test.js | 4 ++-- packages/astro/test/i18n-routing-manual.test.js | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/astro/src/i18n/index.ts b/packages/astro/src/i18n/index.ts index 58cd1a20007d..32cd24f9cff0 100644 --- a/packages/astro/src/i18n/index.ts +++ b/packages/astro/src/i18n/index.ts @@ -7,11 +7,11 @@ import type { ValidRedirectStatus, } from '../@types/astro.js'; import { shouldAppendForwardSlash } from '../core/build/util.js'; +import { REROUTE_DIRECTIVE_HEADER } from '../core/constants.js'; import { MissingLocale } from '../core/errors/errors-data.js'; import { AstroError } from '../core/errors/index.js'; -import type { RoutingStrategies } from './utils.js'; import { createI18nMiddleware } from './middleware.js'; -import { REROUTE_DIRECTIVE_HEADER } from '../core/constants.js'; +import type { RoutingStrategies } from './utils.js'; export function requestHasLocale(locales: Locales) { return function (context: APIContext): boolean { diff --git a/packages/astro/src/i18n/middleware.ts b/packages/astro/src/i18n/middleware.ts index 54aa1249f8fb..42c0f0e763df 100644 --- a/packages/astro/src/i18n/middleware.ts +++ b/packages/astro/src/i18n/middleware.ts @@ -1,15 +1,15 @@ +import type { APIContext, MiddlewareHandler, SSRManifest } from '../@types/astro.js'; +import type { SSRManifestI18n } from '../core/app/types.js'; +import { ROUTE_TYPE_HEADER } from '../core/constants.js'; import { - getPathByLocale, type MiddlewarePayload, - notFound, + getPathByLocale, normalizeTheLocale, - requestHasLocale, + notFound, redirectToDefaultLocale, redirectToFallback, + requestHasLocale, } from './index.js'; -import type { APIContext, MiddlewareHandler, SSRManifest } from '../@types/astro.js'; -import type { SSRManifestI18n } from '../core/app/types.js'; -import { ROUTE_TYPE_HEADER } from '../core/constants.js'; export function createI18nMiddleware( i18n: SSRManifest['i18n'], diff --git a/packages/astro/src/virtual-modules/i18n.ts b/packages/astro/src/virtual-modules/i18n.ts index 0714c08b7949..a0a07f1f0e7e 100644 --- a/packages/astro/src/virtual-modules/i18n.ts +++ b/packages/astro/src/virtual-modules/i18n.ts @@ -1,15 +1,15 @@ -import * as I18nInternals from '../i18n/index.js'; -import { toRoutingStrategy } from '../i18n/utils.js'; -import { AstroError } from '../core/errors/index.js'; -import { IncorrectStrategyForI18n } from '../core/errors/errors-data.js'; -import type { RedirectToFallback } from '../i18n/index.js'; -import type { SSRManifest } from '../core/app/types.js'; import type { APIContext, AstroConfig, MiddlewareHandler, ValidRedirectStatus, } from '../@types/astro.js'; +import type { SSRManifest } from '../core/app/types.js'; +import { IncorrectStrategyForI18n } from '../core/errors/errors-data.js'; +import { AstroError } from '../core/errors/index.js'; +import * as I18nInternals from '../i18n/index.js'; +import type { RedirectToFallback } from '../i18n/index.js'; +import { toRoutingStrategy } from '../i18n/utils.js'; import type { I18nInternalConfig } from '../i18n/vite-plugin-i18n.js'; export { normalizeTheLocale, toCodes, toPaths } from '../i18n/index.js'; diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js index d45754902b2b..60d179ec7111 100644 --- a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js @@ -1,5 +1,5 @@ -import { defineMiddleware, sequence } from 'astro:middleware'; import { middleware } from 'astro:i18n'; +import { defineMiddleware, sequence } from 'astro:middleware'; const customLogic = defineMiddleware(async (context, next) => { const url = new URL(context.request.url); diff --git a/packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js b/packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js index 29634e3ffea1..33b110b638c3 100644 --- a/packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js +++ b/packages/astro/test/fixtures/i18n-routing-manual/src/middleware.js @@ -1,5 +1,5 @@ -import { defineMiddleware } from 'astro:middleware'; import { redirectToDefaultLocale, requestHasLocale } from 'astro:i18n'; +import { defineMiddleware } from 'astro:middleware'; const allowList = new Set(['/help', '/help/']); diff --git a/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js b/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js index 2a80b04b9577..bf0f6e8b97a9 100644 --- a/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js +++ b/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js @@ -1,8 +1,8 @@ -import { describe, it, before, after } from 'node:test'; import assert from 'node:assert/strict'; -import { loadFixture } from './test-utils.js'; +import { after, before, describe, it } from 'node:test'; import * as cheerio from 'cheerio'; import testAdapter from './test-adapter.js'; +import { loadFixture } from './test-utils.js'; // DEV describe('Dev server manual routing', () => { diff --git a/packages/astro/test/i18n-routing-manual.test.js b/packages/astro/test/i18n-routing-manual.test.js index 24f9c187e874..d664b3797889 100644 --- a/packages/astro/test/i18n-routing-manual.test.js +++ b/packages/astro/test/i18n-routing-manual.test.js @@ -1,8 +1,8 @@ -import { describe, it, before, after } from 'node:test'; import assert from 'node:assert/strict'; -import { loadFixture } from './test-utils.js'; +import { after, before, describe, it } from 'node:test'; import * as cheerio from 'cheerio'; import testAdapter from './test-adapter.js'; +import { loadFixture } from './test-utils.js'; // DEV describe('Dev server manual routing', () => { From 989b9d1a23f5c5e2e662f8a543dfd1bcd65414d3 Mon Sep 17 00:00:00 2001 From: Ming-jun Lu <40516784+mingjunlu@users.noreply.github.com> Date: Wed, 10 Apr 2024 22:40:38 +0800 Subject: [PATCH 40/96] feat(toolbar): allow the user to change the placement (#10591) * feat(toolbar): add `placement` to settings * feat(toolbar): update `settings.placement` with ` because it only accepts
 element. (#10538)

* Update highlight.ts

* Create cold-snakes-train.md

* Update Code.astro

Solution for use-case described in withastro/roadmap#276 (https://github.com/withastro/roadmap/discussions/276)

* roll-back initial fix

* new fix

* update changeset

* Update packages/markdown/remark/src/rehype-prism.ts

* Update .changeset/cold-snakes-train.md

Co-authored-by: Sarah Rainsberger 

* Update .changeset/cold-snakes-train.md

Co-authored-by: Sarah Rainsberger 

* Update .changeset/cold-snakes-train.md

Co-authored-by: Sarah Rainsberger 

* Update .changeset/cold-snakes-train.md

Co-authored-by: Sarah Rainsberger 

---------

Co-authored-by: Bjorn Lu 
Co-authored-by: Matthew Phillips 
Co-authored-by: Sarah Rainsberger 
---
 .changeset/cold-snakes-train.md              | 42 ++++++++++++++++++++
 packages/markdown/remark/src/rehype-prism.ts |  2 +-
 packages/markdown/remark/src/shiki.ts        |  5 ++-
 3 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 .changeset/cold-snakes-train.md

diff --git a/.changeset/cold-snakes-train.md b/.changeset/cold-snakes-train.md
new file mode 100644
index 000000000000..0bab4f40e60a
--- /dev/null
+++ b/.changeset/cold-snakes-train.md
@@ -0,0 +1,42 @@
+---
+"@astrojs/markdown-remark": minor
+---
+
+Adds a `data-language` attribute on the rendered `pre` elements to expose the highlighted syntax language.
+
+For example, the following Markdown code block will expose `data-language="python"`:
+```
+\```python
+def func():
+    print('Hello Astro!')
+\```
+```
+
+This allows retrieving the language in a rehype plugin from `node.properties.dataLanguage` by accessing the `
` element using `{ tagName: "pre" }`:
+```js
+// myRehypePre.js
+import { visit } from "unist-util-visit";
+export default function myRehypePre() {
+  return (tree) => {
+    visit(tree, { tagName: "pre" }, (node) => {
+      const lang = node.properties.dataLanguage;
+      [...]
+    });
+  };
+}
+```
+
+Note: The `
` element is not exposed when using Astro's `` component which outputs flattened HTML.
+
+
+The `data-language` attribute may also be used in css rules:
+```css
+pre::before {
+    content: attr(data-language);
+}
+
+pre[data-language="javascript"] {
+  font-size: 2rem;
+}
+```
+
diff --git a/packages/markdown/remark/src/rehype-prism.ts b/packages/markdown/remark/src/rehype-prism.ts
index 2729948ddddf..7f713ddf2fa1 100644
--- a/packages/markdown/remark/src/rehype-prism.ts
+++ b/packages/markdown/remark/src/rehype-prism.ts
@@ -9,7 +9,7 @@ export const rehypePrism: Plugin<[], Root> = () => {
 			let { html, classLanguage } = runHighlighterWithAstro(language, code);
 
 			return Promise.resolve(
-				`
${html}
` + `
${html}
` ); }); }; diff --git a/packages/markdown/remark/src/shiki.ts b/packages/markdown/remark/src/shiki.ts index f3f9d63bf414..798956216d5a 100644 --- a/packages/markdown/remark/src/shiki.ts +++ b/packages/markdown/remark/src/shiki.ts @@ -102,7 +102,10 @@ export async function createShikiHighlighter({ // Replace "shiki" class naming with "astro-code" node.properties.class = classValue.replace(/shiki/g, 'astro-code'); - + + // Add data-language attribute + node.properties.dataLanguage = lang; + // Handle code wrapping // if wrap=null, do nothing. if (wrap === false) { From af7a3f85df1032c8f6ded09402025ecd85d4aa60 Mon Sep 17 00:00:00 2001 From: 604qgc Date: Wed, 10 Apr 2024 16:56:31 +0000 Subject: [PATCH 42/96] [ci] format --- packages/markdown/remark/src/shiki.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/markdown/remark/src/shiki.ts b/packages/markdown/remark/src/shiki.ts index 798956216d5a..66f85b85bd09 100644 --- a/packages/markdown/remark/src/shiki.ts +++ b/packages/markdown/remark/src/shiki.ts @@ -102,10 +102,10 @@ export async function createShikiHighlighter({ // Replace "shiki" class naming with "astro-code" node.properties.class = classValue.replace(/shiki/g, 'astro-code'); - + // Add data-language attribute node.properties.dataLanguage = lang; - + // Handle code wrapping // if wrap=null, do nothing. if (wrap === false) { From e970e32fbf54d612a14599b0280830f7d070149f Mon Sep 17 00:00:00 2001 From: Sarah Rainsberger Date: Wed, 10 Apr 2024 16:49:12 -0300 Subject: [PATCH 43/96] fix some i18n config docs (#10746) * fix some i18n config docs * Move manual option to last position --------- Co-authored-by: = --- packages/astro/src/@types/astro.ts | 54 ++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 705d2673282d..5ef43ff9926b 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1494,22 +1494,11 @@ export interface AstroUserConfig { * @description * * Controls the routing strategy to determine your site URLs. Set this based on your folder/URL path configuration for your default language. + * */ // prettier-ignore routing?: - /** - * - * @docs - * @name i18n.routing.manual - * @type {string} - * @version 4.6.0 - * @description - * When this option is enabled, Astro will **disable** its i18n middleware so that you can implement your own custom logic. No other `routing` options (e.g. `prefixDefaultLocale`) may be configured with `routing: "manual"`. - * - * You will be responsible for writing your own routing logic, or executing Astro's i18n middleware manually alongside your own. - */ - 'manual' - | { + { /** * @docs * @name i18n.routing.prefixDefaultLocale @@ -1526,6 +1515,18 @@ export interface AstroUserConfig { * When `true`, all URLs will display a language prefix. * URLs will be of the form `example.com/[locale]/content/` for every route, including the default language. * Localized folders are used for every language, including the default. + * + * ```js + * export default defineConfig({ + * i18n: { + * defaultLocale: "en", + * locales: ["en", "fr", "pt-br", "es"], + * routing: { + * prefixDefaultLocale: true, + * } + * } + * }) + * ``` */ prefixDefaultLocale?: boolean; @@ -1568,7 +1569,32 @@ export interface AstroUserConfig { * - `"pathname": The strategy is applied to the pathname of the URLs */ strategy?: 'pathname'; - }; + } | + /** + * + * @docs + * @name i18n.routing.manual + * @kind h4 + * @type {string} + * @version 4.6.0 + * @description + * When this option is enabled, Astro will **disable** its i18n middleware so that you can implement your own custom logic. No other `routing` options (e.g. `prefixDefaultLocale`) may be configured with `routing: "manual"`. + * + * You will be responsible for writing your own routing logic, or executing Astro's i18n middleware manually alongside your own. + * + * ```js + * export default defineConfig({ + * i18n: { + * defaultLocale: "en", + * locales: ["en", "fr", "pt-br", "es"], + * routing: { + * prefixDefaultLocale: true, + * } + * } + * }) + * ``` + */ + 'manual'; /** * @name i18n.domains From 0d437d80dde9494d27a46ceb063f764c9e7c9978 Mon Sep 17 00:00:00 2001 From: Sarah Rainsberger Date: Wed, 10 Apr 2024 19:50:12 +0000 Subject: [PATCH 44/96] [ci] format --- packages/astro/src/@types/astro.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 5ef43ff9926b..0650f901b9f2 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1494,7 +1494,7 @@ export interface AstroUserConfig { * @description * * Controls the routing strategy to determine your site URLs. Set this based on your folder/URL path configuration for your default language. - * + * */ // prettier-ignore routing?: From a8f34c0b17b5a6de8a4344854962add40d13d930 Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Thu, 11 Apr 2024 08:07:21 +0530 Subject: [PATCH 45/96] fix(rendering): remove render instructions from slot expressions (#10747) --- .changeset/calm-mails-check.md | 5 +++++ packages/astro/src/core/render/index.ts | 2 +- .../astro/src/core/render/{result.ts => slots.ts} | 6 ++++-- .../runtime/server/render/astro/render-template.ts | 2 +- packages/astro/test/astro-slots.test.js | 11 +++++++++++ .../astro-slots/src/components/FunctionsToAPI.astro | 12 ++++++++++++ .../src/pages/slotted-named-functions.astro | 11 +++++++++++ 7 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 .changeset/calm-mails-check.md rename packages/astro/src/core/render/{result.ts => slots.ts} (90%) create mode 100644 packages/astro/test/fixtures/astro-slots/src/components/FunctionsToAPI.astro create mode 100644 packages/astro/test/fixtures/astro-slots/src/pages/slotted-named-functions.astro diff --git a/.changeset/calm-mails-check.md b/.changeset/calm-mails-check.md new file mode 100644 index 000000000000..7de709c1b0ec --- /dev/null +++ b/.changeset/calm-mails-check.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes an issue where functions could not be used as named slots. diff --git a/packages/astro/src/core/render/index.ts b/packages/astro/src/core/render/index.ts index 35b5ce76ec8d..db14701b0fde 100644 --- a/packages/astro/src/core/render/index.ts +++ b/packages/astro/src/core/render/index.ts @@ -3,7 +3,7 @@ import type { Pipeline } from '../base-pipeline.js'; export { Pipeline } from '../base-pipeline.js'; export { getParams, getProps } from './params-and-props.js'; export { loadRenderer } from './renderer.js'; -export { Slots } from './result.js'; +export { Slots } from './slots.js'; export interface SSROptions { /** The pipeline instance */ diff --git a/packages/astro/src/core/render/result.ts b/packages/astro/src/core/render/slots.ts similarity index 90% rename from packages/astro/src/core/render/result.ts rename to packages/astro/src/core/render/slots.ts index e23e87adf7c4..f6d469b2a704 100644 --- a/packages/astro/src/core/render/result.ts +++ b/packages/astro/src/core/render/slots.ts @@ -2,13 +2,15 @@ import type { SSRResult } from '../../@types/astro.js'; import { type ComponentSlots, renderSlotToString } from '../../runtime/server/index.js'; import { renderJSX } from '../../runtime/server/jsx.js'; import { chunkToString } from '../../runtime/server/render/index.js'; +import { isRenderInstruction } from '../../runtime/server/render/instruction.js'; import { AstroError, AstroErrorData } from '../errors/index.js'; import type { Logger } from '../logger/core.js'; function getFunctionExpression(slot: any) { if (!slot) return; - if (slot.expressions?.length !== 1) return; - return slot.expressions[0] as (...args: any[]) => any; + const expressions = slot?.expressions?.filter((e: unknown) => isRenderInstruction(e) === false); + if (expressions?.length !== 1) return + return expressions[0] as (...args: any[]) => any; } export class Slots { diff --git a/packages/astro/src/runtime/server/render/astro/render-template.ts b/packages/astro/src/runtime/server/render/astro/render-template.ts index f12344fe86f6..68df865181fb 100644 --- a/packages/astro/src/runtime/server/render/astro/render-template.ts +++ b/packages/astro/src/runtime/server/render/astro/render-template.ts @@ -11,7 +11,7 @@ const renderTemplateResultSym = Symbol.for('astro.renderTemplateResult'); export class RenderTemplateResult { public [renderTemplateResultSym] = true; private htmlParts: TemplateStringsArray; - private expressions: any[]; + public expressions: any[]; private error: Error | undefined; constructor(htmlParts: TemplateStringsArray, expressions: unknown[]) { this.htmlParts = htmlParts; diff --git a/packages/astro/test/astro-slots.test.js b/packages/astro/test/astro-slots.test.js index 5653e0421ce3..5078ead05ef7 100644 --- a/packages/astro/test/astro-slots.test.js +++ b/packages/astro/test/astro-slots.test.js @@ -170,4 +170,15 @@ describe('Slots', () => { assert.notEqual(third.children[0].data, first.children[0].data); } }); + + it("Arguments can be passed to named slots with Astro.slots.render()", async () => { + const html = await fixture.readFile('/slotted-named-functions/index.html'); + const $ = cheerio.load(html); + const befor = $("div#before"); + const [ beforeDiv ] = befor.children("div") + assert.deepEqual(beforeDiv.firstChild.data, "Test Content BEFORE") + const after = $("div#after"); + const [ afterDiv ] = after.children("div"); + assert.deepEqual(afterDiv.firstChild.data, "Test Content AFTER") + }); }); diff --git a/packages/astro/test/fixtures/astro-slots/src/components/FunctionsToAPI.astro b/packages/astro/test/fixtures/astro-slots/src/components/FunctionsToAPI.astro new file mode 100644 index 000000000000..93d50689fab0 --- /dev/null +++ b/packages/astro/test/fixtures/astro-slots/src/components/FunctionsToAPI.astro @@ -0,0 +1,12 @@ +--- +const content = 'Test Content'; +const beforeConent = await Astro.slots.render("before", [{content}]) +const afterConent = await Astro.slots.render("after", [{content}]) +--- +
+ {beforeConent} +
+
+ {afterConent} +
+ diff --git a/packages/astro/test/fixtures/astro-slots/src/pages/slotted-named-functions.astro b/packages/astro/test/fixtures/astro-slots/src/pages/slotted-named-functions.astro new file mode 100644 index 000000000000..7885af69468e --- /dev/null +++ b/packages/astro/test/fixtures/astro-slots/src/pages/slotted-named-functions.astro @@ -0,0 +1,11 @@ +--- +import Field from '../components/FunctionsToAPI.astro' +--- + +
+ {({content}) =>
{content} BEFORE
} +
+
+ {({content}) =>
{content} AFTER
} +
+
\ No newline at end of file From 5e9b61b032946c4e237e409ec902a3668a95d6e1 Mon Sep 17 00:00:00 2001 From: Arsh Date: Thu, 11 Apr 2024 02:38:29 +0000 Subject: [PATCH 46/96] [ci] format --- packages/astro/src/core/render/slots.ts | 2 +- packages/astro/test/astro-slots.test.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/astro/src/core/render/slots.ts b/packages/astro/src/core/render/slots.ts index f6d469b2a704..b590237bab00 100644 --- a/packages/astro/src/core/render/slots.ts +++ b/packages/astro/src/core/render/slots.ts @@ -9,7 +9,7 @@ import type { Logger } from '../logger/core.js'; function getFunctionExpression(slot: any) { if (!slot) return; const expressions = slot?.expressions?.filter((e: unknown) => isRenderInstruction(e) === false); - if (expressions?.length !== 1) return + if (expressions?.length !== 1) return; return expressions[0] as (...args: any[]) => any; } diff --git a/packages/astro/test/astro-slots.test.js b/packages/astro/test/astro-slots.test.js index 5078ead05ef7..78b8a5cae351 100644 --- a/packages/astro/test/astro-slots.test.js +++ b/packages/astro/test/astro-slots.test.js @@ -171,14 +171,14 @@ describe('Slots', () => { } }); - it("Arguments can be passed to named slots with Astro.slots.render()", async () => { + it('Arguments can be passed to named slots with Astro.slots.render()', async () => { const html = await fixture.readFile('/slotted-named-functions/index.html'); const $ = cheerio.load(html); - const befor = $("div#before"); - const [ beforeDiv ] = befor.children("div") - assert.deepEqual(beforeDiv.firstChild.data, "Test Content BEFORE") - const after = $("div#after"); - const [ afterDiv ] = after.children("div"); - assert.deepEqual(afterDiv.firstChild.data, "Test Content AFTER") + const befor = $('div#before'); + const [beforeDiv] = befor.children('div'); + assert.deepEqual(beforeDiv.firstChild.data, 'Test Content BEFORE'); + const after = $('div#after'); + const [afterDiv] = after.children('div'); + assert.deepEqual(afterDiv.firstChild.data, 'Test Content AFTER'); }); }); From 02477b818dc4d8c7a8790db8f87aa2dd591af7f3 Mon Sep 17 00:00:00 2001 From: Oliver Speir <115520730+OliverSpeir@users.noreply.github.com> Date: Thu, 11 Apr 2024 02:03:56 -0600 Subject: [PATCH 47/96] Update a11y-no-noninteractive-tabindex rule for dev tool bar (#10750) * fix: a11y-no-noninteractive-tabindex * add changeset --- .changeset/few-mails-kiss.md | 5 +++++ .../src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .changeset/few-mails-kiss.md diff --git a/.changeset/few-mails-kiss.md b/.changeset/few-mails-kiss.md new file mode 100644 index 000000000000..6bf4fed23986 --- /dev/null +++ b/.changeset/few-mails-kiss.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes a false positive for "Invalid `tabindex` on non-interactive element" rule for roleless elements ( `div` and `span` ). diff --git a/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts b/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts index 27da9b011e0d..6d07f36e0ac7 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/apps/audit/rules/a11y.ts @@ -513,7 +513,11 @@ export const a11y: AuditRuleWithSelector[] = [ if (!isInteractive(element)) return false; - if (!interactiveElements.includes(element.localName)) return true; + if ( + !interactiveElements.includes(element.localName) && + !roleless_elements.includes(element.localName) + ) + return true; }, }, { From 328720102cae9041a3d72889d8fd5d301e324b4c Mon Sep 17 00:00:00 2001 From: aswind7 <854413241@qq.com> Date: Thu, 11 Apr 2024 17:04:22 +0800 Subject: [PATCH 48/96] Update utils.ts: Optimize and simplify code (#10749) Update utils.ts: Optimize and simplify code --- packages/astro/src/i18n/utils.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/astro/src/i18n/utils.ts b/packages/astro/src/i18n/utils.ts index 5d9de5c43e5b..4bb237eda38b 100644 --- a/packages/astro/src/i18n/utils.ts +++ b/packages/astro/src/i18n/utils.ts @@ -71,11 +71,7 @@ function sortAndFilterLocales(browserLocaleList: BrowserLocale[], locales: Local }) .sort((a, b) => { if (a.qualityValue && b.qualityValue) { - if (a.qualityValue > b.qualityValue) { - return -1; - } else if (a.qualityValue < b.qualityValue) { - return 1; - } + return Math.sign(b.qualityValue - a.qualityValue); } return 0; }); From 391cb01d0cfda440d80f693f079943935ac9d23e Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Thu, 11 Apr 2024 14:56:46 +0530 Subject: [PATCH 49/96] fix(cli): call path.replace only if it is a function (#10745) * fix(cli): call `path.replace` only if it is a function * add changeset --- .changeset/late-spoons-knock.md | 5 +++++ packages/astro/src/core/errors/dev/utils.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/late-spoons-knock.md diff --git a/.changeset/late-spoons-knock.md b/.changeset/late-spoons-knock.md new file mode 100644 index 000000000000..0cca6ce612f7 --- /dev/null +++ b/.changeset/late-spoons-knock.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes an issue where CLI commands could not report the reason for failure before exiting. diff --git a/packages/astro/src/core/errors/dev/utils.ts b/packages/astro/src/core/errors/dev/utils.ts index a61d1ee47c5a..f5de83de4758 100644 --- a/packages/astro/src/core/errors/dev/utils.ts +++ b/packages/astro/src/core/errors/dev/utils.ts @@ -174,7 +174,7 @@ function collectInfoFromStacktrace(error: SSRError & { stack: string }): StackIn stackText.split('\n').find((ln) => ln.includes('src') || ln.includes('node_modules')); // Disable eslint as we're not sure how to improve this regex yet // eslint-disable-next-line regexp/no-super-linear-backtracking - const source = possibleFilePath?.replace(/^[^(]+\(([^)]+).*$/, '$1').replace(/^\s+at\s+/, ''); + const source = possibleFilePath?.replace?.(/^[^(]+\(([^)]+).*$/, '$1').replace(/^\s+at\s+/, ''); let file = source?.replace(/:\d+/g, ''); const location = /:(\d+):(\d+)/.exec(source!) ?? []; From 4ed7f829f6f6eda4a215b7f641441f7506d26cb6 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Thu, 11 Apr 2024 07:21:20 -0400 Subject: [PATCH 50/96] fix: rewrite Node.js changeset (#10753) * fix: rewrite Node.js changeset * Update .changeset/empty-rules-type.md Co-authored-by: Sarah Rainsberger --------- Co-authored-by: Sarah Rainsberger --- .changeset/empty-rules-type.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.changeset/empty-rules-type.md b/.changeset/empty-rules-type.md index fd4933291b7f..afd185e98897 100644 --- a/.changeset/empty-rules-type.md +++ b/.changeset/empty-rules-type.md @@ -13,5 +13,6 @@ "astro": minor --- -Upgrades the minimum version of Node.js to `v18.20.1`. This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support). +Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line. +This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support). From ceffbb1049360358424cb89310ed612d3ca9bba6 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Thu, 11 Apr 2024 04:24:47 -0700 Subject: [PATCH 51/96] [ci] release (#10739) Co-authored-by: github-actions[bot] --- .changeset/calm-mails-check.md | 5 -- .changeset/cold-snakes-train.md | 42 ---------- .changeset/dry-eels-yell.md | 5 -- .changeset/empty-rules-type.md | 18 ---- .changeset/fair-jars-behave.md | 24 ------ .changeset/few-mails-kiss.md | 5 -- .changeset/late-spoons-knock.md | 5 -- .changeset/little-hornets-give.md | 48 ----------- .changeset/shaggy-cats-film.md | 5 -- .changeset/short-flies-itch.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 4 +- examples/component/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-lit/package.json | 2 +- examples/framework-multiple/package.json | 12 +-- examples/framework-preact/package.json | 4 +- examples/framework-react/package.json | 4 +- examples/framework-solid/package.json | 4 +- examples/framework-svelte/package.json | 4 +- examples/framework-vue/package.json | 4 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/middleware/package.json | 2 +- examples/minimal/package.json | 2 +- examples/non-html-pages/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 4 +- examples/starlog/package.json | 2 +- examples/view-transitions/package.json | 2 +- examples/with-markdoc/package.json | 4 +- examples/with-markdown-plugins/package.json | 4 +- examples/with-markdown-shiki/package.json | 2 +- examples/with-mdx/package.json | 6 +- examples/with-nanostores/package.json | 4 +- examples/with-tailwindcss/package.json | 4 +- examples/with-vitest/package.json | 2 +- packages/astro-prism/CHANGELOG.md | 8 ++ packages/astro-prism/package.json | 2 +- packages/astro/CHANGELOG.md | 92 +++++++++++++++++++++ packages/astro/package.json | 2 +- packages/create-astro/CHANGELOG.md | 8 ++ packages/create-astro/package.json | 2 +- packages/integrations/markdoc/CHANGELOG.md | 14 ++++ packages/integrations/markdoc/package.json | 2 +- packages/integrations/mdx/CHANGELOG.md | 13 +++ packages/integrations/mdx/package.json | 2 +- packages/integrations/preact/CHANGELOG.md | 8 ++ packages/integrations/preact/package.json | 2 +- packages/integrations/react/CHANGELOG.md | 8 ++ packages/integrations/react/package.json | 2 +- packages/integrations/solid/CHANGELOG.md | 8 ++ packages/integrations/solid/package.json | 2 +- packages/integrations/svelte/CHANGELOG.md | 8 ++ packages/integrations/svelte/package.json | 2 +- packages/integrations/vue/CHANGELOG.md | 8 ++ packages/integrations/vue/package.json | 2 +- packages/markdown/remark/CHANGELOG.md | 49 +++++++++++ packages/markdown/remark/package.json | 4 +- packages/telemetry/CHANGELOG.md | 8 ++ packages/telemetry/package.json | 2 +- packages/upgrade/CHANGELOG.md | 8 ++ packages/upgrade/package.json | 2 +- pnpm-lock.yaml | 92 ++++++++++----------- 64 files changed, 345 insertions(+), 267 deletions(-) delete mode 100644 .changeset/calm-mails-check.md delete mode 100644 .changeset/cold-snakes-train.md delete mode 100644 .changeset/dry-eels-yell.md delete mode 100644 .changeset/empty-rules-type.md delete mode 100644 .changeset/fair-jars-behave.md delete mode 100644 .changeset/few-mails-kiss.md delete mode 100644 .changeset/late-spoons-knock.md delete mode 100644 .changeset/little-hornets-give.md delete mode 100644 .changeset/shaggy-cats-film.md delete mode 100644 .changeset/short-flies-itch.md diff --git a/.changeset/calm-mails-check.md b/.changeset/calm-mails-check.md deleted file mode 100644 index 7de709c1b0ec..000000000000 --- a/.changeset/calm-mails-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes an issue where functions could not be used as named slots. diff --git a/.changeset/cold-snakes-train.md b/.changeset/cold-snakes-train.md deleted file mode 100644 index 0bab4f40e60a..000000000000 --- a/.changeset/cold-snakes-train.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -"@astrojs/markdown-remark": minor ---- - -Adds a `data-language` attribute on the rendered `pre` elements to expose the highlighted syntax language. - -For example, the following Markdown code block will expose `data-language="python"`: -``` -\```python -def func(): - print('Hello Astro!') -\``` -``` - -This allows retrieving the language in a rehype plugin from `node.properties.dataLanguage` by accessing the `
` element using `{ tagName: "pre" }`:
-```js
-// myRehypePre.js
-import { visit } from "unist-util-visit";
-export default function myRehypePre() {
-  return (tree) => {
-    visit(tree, { tagName: "pre" }, (node) => {
-      const lang = node.properties.dataLanguage;
-      [...]
-    });
-  };
-}
-```
-
-Note: The `
` element is not exposed when using Astro's `` component which outputs flattened HTML.
-
-
-The `data-language` attribute may also be used in css rules:
-```css
-pre::before {
-    content: attr(data-language);
-}
-
-pre[data-language="javascript"] {
-  font-size: 2rem;
-}
-```
-
diff --git a/.changeset/dry-eels-yell.md b/.changeset/dry-eels-yell.md
deleted file mode 100644
index 3b7a20f3a1d3..000000000000
--- a/.changeset/dry-eels-yell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"astro": minor
----
-
-Adds a new dev toolbar settings option to change the horizontal placement of the dev toolbar on your screen: bottom left, bottom center, or bottom right.
diff --git a/.changeset/empty-rules-type.md b/.changeset/empty-rules-type.md
deleted file mode 100644
index afd185e98897..000000000000
--- a/.changeset/empty-rules-type.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-"@astrojs/markdoc": minor
-"@astrojs/preact": minor
-"@astrojs/svelte": minor
-"@astrojs/react": minor
-"@astrojs/solid-js": minor
-"@astrojs/mdx": minor
-"@astrojs/vue": minor
-"create-astro": minor
-"@astrojs/prism": minor
-"@astrojs/telemetry": minor
-"@astrojs/upgrade": minor
-"astro": minor
----
-
-Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
-
-This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
diff --git a/.changeset/fair-jars-behave.md b/.changeset/fair-jars-behave.md
deleted file mode 100644
index 700b1b883021..000000000000
--- a/.changeset/fair-jars-behave.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-"astro": minor
----
-
-Adds a new experimental security option to prevent [Cross-Site Request Forgery (CSRF) attacks](https://owasp.org/www-community/attacks/csrf). This feature is available only for pages rendered on demand:
-
-```js
-import { defineConfig } from "astro/config"
-export default defineConfig({
-  experimental: {
-    security: {
-      csrfProtection: {
-        origin: true
-      }
-    }
-  }
-})
-```
-
-Enabling this setting performs a check that the "origin" header, automatically passed by all modern browsers, matches the URL sent by each `Request`.
-
-This experimental "origin" check is executed only for pages rendered on demand, and only for the requests `POST, `PATCH`, `DELETE` and `PUT` with one of the following `content-type` headers: 'application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'.
-
-It the "origin" header doesn't match the pathname of the request, Astro will return a 403 status code and won't render the page.
diff --git a/.changeset/few-mails-kiss.md b/.changeset/few-mails-kiss.md
deleted file mode 100644
index 6bf4fed23986..000000000000
--- a/.changeset/few-mails-kiss.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"astro": patch
----
-
-Fixes a false positive for "Invalid `tabindex` on non-interactive element" rule for roleless elements ( `div` and `span` ).
diff --git a/.changeset/late-spoons-knock.md b/.changeset/late-spoons-knock.md
deleted file mode 100644
index 0cca6ce612f7..000000000000
--- a/.changeset/late-spoons-knock.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"astro": patch
----
-
-Fixes an issue where CLI commands could not report the reason for failure before exiting.
diff --git a/.changeset/little-hornets-give.md b/.changeset/little-hornets-give.md
deleted file mode 100644
index fdbb6492eec0..000000000000
--- a/.changeset/little-hornets-give.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-"astro": minor
----
-
-Adds a new i18n routing option `manual` to allow you to write your own i18n middleware:
-
-```js
-import { defineConfig } from "astro/config"
-// astro.config.mjs
-export default defineConfig({
-    i18n: {
-        locales: ["en", "fr"],
-        defaultLocale: "fr",
-        routing: "manual"
-    }
-})
-```
-
-Adding `routing: "manual"` to your i18n config disables Astro's own i18n middleware and provides you with helper functions to write your own: `redirectToDefaultLocale`, `notFound`, and `redirectToFallback`:
-
-```js
-// middleware.js
-import { redirectToDefaultLocale } from "astro:i18n";
-export const onRequest = defineMiddleware(async (context, next) => {
-    if (context.url.startsWith("/about")) {
-        return next()
-    } else {
-        return redirectToDefaultLocale(context, 302);  
-    }
-})
-```
-
-Also adds a `middleware` function that manually creates Astro's i18n middleware. This allows you to extend Astro's i18n routing instead of completely replacing it. Run `middleware` in combination with your own middleware, using the `sequence` utility to determine the order:
-
-```js title="src/middleware.js"
-import {defineMiddleware, sequence} from "astro:middleware";
-import { middleware } from "astro:i18n"; // Astro's own i18n routing config
-
-export const userMiddleware = defineMiddleware();
-
-export const onRequest = sequence(
-  userMiddleware,
-  middleware({
-    redirectToDefaultLocale: false,
-    prefixDefaultLocale: true
-  })
-)
-```
diff --git a/.changeset/shaggy-cats-film.md b/.changeset/shaggy-cats-film.md
deleted file mode 100644
index 4aaecea6c026..000000000000
--- a/.changeset/shaggy-cats-film.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"astro": minor
----
-
-Adds the `httpOnly`, `sameSite`, and `secure` options when deleting a cookie
diff --git a/.changeset/short-flies-itch.md b/.changeset/short-flies-itch.md
deleted file mode 100644
index 929bdec522aa..000000000000
--- a/.changeset/short-flies-itch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"astro": patch
----
-
-Fixed errorOverlay theme toggle bug.
diff --git a/examples/basics/package.json b/examples/basics/package.json
index 40fc8695da66..e6967359976c 100644
--- a/examples/basics/package.json
+++ b/examples/basics/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/blog/package.json b/examples/blog/package.json
index 6a3c24b57ad9..03925559a3a6 100644
--- a/examples/blog/package.json
+++ b/examples/blog/package.json
@@ -11,9 +11,9 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/mdx": "^2.2.4",
+    "@astrojs/mdx": "^2.3.0",
     "@astrojs/rss": "^4.0.5",
     "@astrojs/sitemap": "^3.1.2",
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/component/package.json b/examples/component/package.json
index 3d946e417242..422950059d17 100644
--- a/examples/component/package.json
+++ b/examples/component/package.json
@@ -15,7 +15,7 @@
   ],
   "scripts": {},
   "devDependencies": {
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   },
   "peerDependencies": {
     "astro": "^4.0.0"
diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json
index 4a604ab94795..c8d8d8655397 100644
--- a/examples/framework-alpine/package.json
+++ b/examples/framework-alpine/package.json
@@ -14,6 +14,6 @@
     "@astrojs/alpinejs": "^0.4.0",
     "@types/alpinejs": "^3.13.5",
     "alpinejs": "^3.13.3",
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json
index 7a95577aeb53..407d65877b65 100644
--- a/examples/framework-lit/package.json
+++ b/examples/framework-lit/package.json
@@ -13,7 +13,7 @@
   "dependencies": {
     "@astrojs/lit": "^4.0.1",
     "@webcomponents/template-shadowroot": "^0.2.1",
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "lit": "^3.1.2"
   }
 }
diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json
index 2e5900dad665..43ded5197100 100644
--- a/examples/framework-multiple/package.json
+++ b/examples/framework-multiple/package.json
@@ -11,14 +11,14 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/preact": "^3.1.2",
-    "@astrojs/react": "^3.2.0",
-    "@astrojs/solid-js": "^4.0.1",
-    "@astrojs/svelte": "^5.3.0",
-    "@astrojs/vue": "^4.0.11",
+    "@astrojs/preact": "^3.2.0",
+    "@astrojs/react": "^3.3.0",
+    "@astrojs/solid-js": "^4.1.0",
+    "@astrojs/svelte": "^5.4.0",
+    "@astrojs/vue": "^4.1.0",
     "@types/react": "^18.2.37",
     "@types/react-dom": "^18.2.15",
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "preact": "^10.19.2",
     "react": "^18.2.0",
     "react-dom": "^18.2.0",
diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json
index 5fcdaa79402d..870bd442e740 100644
--- a/examples/framework-preact/package.json
+++ b/examples/framework-preact/package.json
@@ -11,9 +11,9 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/preact": "^3.1.2",
+    "@astrojs/preact": "^3.2.0",
     "@preact/signals": "^1.2.1",
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "preact": "^10.19.2"
   }
 }
diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json
index 726c9f1ba207..3ea028b46da0 100644
--- a/examples/framework-react/package.json
+++ b/examples/framework-react/package.json
@@ -11,10 +11,10 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/react": "^3.2.0",
+    "@astrojs/react": "^3.3.0",
     "@types/react": "^18.2.37",
     "@types/react-dom": "^18.2.15",
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "react": "^18.2.0",
     "react-dom": "^18.2.0"
   }
diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json
index d15776f40165..0695f05c1c35 100644
--- a/examples/framework-solid/package.json
+++ b/examples/framework-solid/package.json
@@ -11,8 +11,8 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/solid-js": "^4.0.1",
-    "astro": "^4.5.18",
+    "@astrojs/solid-js": "^4.1.0",
+    "astro": "^4.6.0",
     "solid-js": "^1.8.5"
   }
 }
diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json
index 806691556a1b..bc2f8ce3d3aa 100644
--- a/examples/framework-svelte/package.json
+++ b/examples/framework-svelte/package.json
@@ -11,8 +11,8 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/svelte": "^5.3.0",
-    "astro": "^4.5.18",
+    "@astrojs/svelte": "^5.4.0",
+    "astro": "^4.6.0",
     "svelte": "^4.2.5"
   }
 }
diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json
index 042b0878f58e..f6044a9075a7 100644
--- a/examples/framework-vue/package.json
+++ b/examples/framework-vue/package.json
@@ -11,8 +11,8 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/vue": "^4.0.11",
-    "astro": "^4.5.18",
+    "@astrojs/vue": "^4.1.0",
+    "astro": "^4.6.0",
     "vue": "^3.3.8"
   }
 }
diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json
index f243a46a1eed..3c45703a6643 100644
--- a/examples/hackernews/package.json
+++ b/examples/hackernews/package.json
@@ -12,6 +12,6 @@
   },
   "dependencies": {
     "@astrojs/node": "^8.2.5",
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/integration/package.json b/examples/integration/package.json
index d10058c6ca9a..f9b5103cea22 100644
--- a/examples/integration/package.json
+++ b/examples/integration/package.json
@@ -15,7 +15,7 @@
   ],
   "scripts": {},
   "devDependencies": {
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   },
   "peerDependencies": {
     "astro": "^4.0.0"
diff --git a/examples/middleware/package.json b/examples/middleware/package.json
index ff0365f19d57..d078dcaee950 100644
--- a/examples/middleware/package.json
+++ b/examples/middleware/package.json
@@ -13,7 +13,7 @@
   },
   "dependencies": {
     "@astrojs/node": "^8.2.5",
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "html-minifier": "^4.0.0"
   },
   "devDependencies": {
diff --git a/examples/minimal/package.json b/examples/minimal/package.json
index c6008d0106c1..a0b8dfcb1cdf 100644
--- a/examples/minimal/package.json
+++ b/examples/minimal/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json
index f9637318df46..3b7608d70e1a 100644
--- a/examples/non-html-pages/package.json
+++ b/examples/non-html-pages/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json
index ef688cad5c5a..9eb3b2b97e7d 100644
--- a/examples/portfolio/package.json
+++ b/examples/portfolio/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/ssr/package.json b/examples/ssr/package.json
index 2833723dd471..667ed53e12b2 100644
--- a/examples/ssr/package.json
+++ b/examples/ssr/package.json
@@ -13,8 +13,8 @@
   },
   "dependencies": {
     "@astrojs/node": "^8.2.5",
-    "@astrojs/svelte": "^5.3.0",
-    "astro": "^4.5.18",
+    "@astrojs/svelte": "^5.4.0",
+    "astro": "^4.6.0",
     "svelte": "^4.2.5"
   }
 }
diff --git a/examples/starlog/package.json b/examples/starlog/package.json
index 57bd5fb7bd63..e9efca280ec8 100644
--- a/examples/starlog/package.json
+++ b/examples/starlog/package.json
@@ -10,7 +10,7 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "sass": "^1.69.5",
     "sharp": "^0.32.6"
   }
diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json
index ff75bb8c538f..26fe5823ca45 100644
--- a/examples/view-transitions/package.json
+++ b/examples/view-transitions/package.json
@@ -12,6 +12,6 @@
   "devDependencies": {
     "@astrojs/tailwind": "^5.1.0",
     "@astrojs/node": "^8.2.5",
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json
index a14607f9a14f..193589627c44 100644
--- a/examples/with-markdoc/package.json
+++ b/examples/with-markdoc/package.json
@@ -11,7 +11,7 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/markdoc": "^0.9.5",
-    "astro": "^4.5.18"
+    "@astrojs/markdoc": "^0.10.0",
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json
index d24c98b8b90f..449c58d70937 100644
--- a/examples/with-markdown-plugins/package.json
+++ b/examples/with-markdown-plugins/package.json
@@ -11,8 +11,8 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/markdown-remark": "^5.0.0",
-    "astro": "^4.5.18",
+    "@astrojs/markdown-remark": "^5.1.0",
+    "astro": "^4.6.0",
     "hast-util-select": "^6.0.2",
     "rehype-autolink-headings": "^7.1.0",
     "rehype-slug": "^6.0.0",
diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json
index 6145c14ac7d0..493ec1a85271 100644
--- a/examples/with-markdown-shiki/package.json
+++ b/examples/with-markdown-shiki/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.5.18"
+    "astro": "^4.6.0"
   }
 }
diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json
index 878740030530..c996b84223db 100644
--- a/examples/with-mdx/package.json
+++ b/examples/with-mdx/package.json
@@ -11,9 +11,9 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/mdx": "^2.2.4",
-    "@astrojs/preact": "^3.1.2",
-    "astro": "^4.5.18",
+    "@astrojs/mdx": "^2.3.0",
+    "@astrojs/preact": "^3.2.0",
+    "astro": "^4.6.0",
     "preact": "^10.19.2"
   }
 }
diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json
index 47312f4269a8..7fe2f1dabcef 100644
--- a/examples/with-nanostores/package.json
+++ b/examples/with-nanostores/package.json
@@ -11,9 +11,9 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/preact": "^3.1.2",
+    "@astrojs/preact": "^3.2.0",
     "@nanostores/preact": "^0.5.0",
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "nanostores": "^0.9.5",
     "preact": "^10.19.2"
   }
diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json
index d3696d1e57fa..20020732a554 100644
--- a/examples/with-tailwindcss/package.json
+++ b/examples/with-tailwindcss/package.json
@@ -11,10 +11,10 @@
     "astro": "astro"
   },
   "dependencies": {
-    "@astrojs/mdx": "^2.2.4",
+    "@astrojs/mdx": "^2.3.0",
     "@astrojs/tailwind": "^5.1.0",
     "@types/canvas-confetti": "^1.6.3",
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "autoprefixer": "^10.4.15",
     "canvas-confetti": "^1.9.1",
     "postcss": "^8.4.28",
diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json
index fbbbcfd908c7..b408fa7190b0 100644
--- a/examples/with-vitest/package.json
+++ b/examples/with-vitest/package.json
@@ -12,7 +12,7 @@
     "test": "vitest"
   },
   "dependencies": {
-    "astro": "^4.5.18",
+    "astro": "^4.6.0",
     "vitest": "^1.3.1"
   }
 }
diff --git a/packages/astro-prism/CHANGELOG.md b/packages/astro-prism/CHANGELOG.md
index 35f7f5106b29..9a1b8ba9c4c6 100644
--- a/packages/astro-prism/CHANGELOG.md
+++ b/packages/astro-prism/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/prism
 
+## 3.1.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 3.0.0
 
 ### Major Changes
diff --git a/packages/astro-prism/package.json b/packages/astro-prism/package.json
index 584ebce935e3..0a10a764e146 100644
--- a/packages/astro-prism/package.json
+++ b/packages/astro-prism/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/prism",
-  "version": "3.0.0",
+  "version": "3.1.0",
   "description": "Add Prism syntax highlighting support to your Astro site",
   "author": "withastro",
   "type": "module",
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index 4450a20e07a8..d38f80b01bce 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,97 @@
 # astro
 
+## 4.6.0
+
+### Minor Changes
+
+- [#10591](https://github.com/withastro/astro/pull/10591) [`39988ef8e2c4c4888543c973e06d9b9939e4ac95`](https://github.com/withastro/astro/commit/39988ef8e2c4c4888543c973e06d9b9939e4ac95) Thanks [@mingjunlu](https://github.com/mingjunlu)! - Adds a new dev toolbar settings option to change the horizontal placement of the dev toolbar on your screen: bottom left, bottom center, or bottom right.
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
+- [#10678](https://github.com/withastro/astro/pull/10678) [`2e53b5fff6d292b7acdf8c30a6ecf5e5696846a1`](https://github.com/withastro/astro/commit/2e53b5fff6d292b7acdf8c30a6ecf5e5696846a1) Thanks [@ematipico](https://github.com/ematipico)! - Adds a new experimental security option to prevent [Cross-Site Request Forgery (CSRF) attacks](https://owasp.org/www-community/attacks/csrf). This feature is available only for pages rendered on demand:
+
+  ```js
+  import { defineConfig } from 'astro/config';
+  export default defineConfig({
+    experimental: {
+      security: {
+        csrfProtection: {
+          origin: true,
+        },
+      },
+    },
+  });
+  ```
+
+  Enabling this setting performs a check that the "origin" header, automatically passed by all modern browsers, matches the URL sent by each `Request`.
+
+  This experimental "origin" check is executed only for pages rendered on demand, and only for the requests `POST, `PATCH`, `DELETE`and`PUT`with one of the following`content-type` headers: 'application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'.
+
+  It the "origin" header doesn't match the pathname of the request, Astro will return a 403 status code and won't render the page.
+
+- [#10193](https://github.com/withastro/astro/pull/10193) [`440681e7b74511a17b152af0fd6e0e4dc4014025`](https://github.com/withastro/astro/commit/440681e7b74511a17b152af0fd6e0e4dc4014025) Thanks [@ematipico](https://github.com/ematipico)! - Adds a new i18n routing option `manual` to allow you to write your own i18n middleware:
+
+  ```js
+  import { defineConfig } from 'astro/config';
+  // astro.config.mjs
+  export default defineConfig({
+    i18n: {
+      locales: ['en', 'fr'],
+      defaultLocale: 'fr',
+      routing: 'manual',
+    },
+  });
+  ```
+
+  Adding `routing: "manual"` to your i18n config disables Astro's own i18n middleware and provides you with helper functions to write your own: `redirectToDefaultLocale`, `notFound`, and `redirectToFallback`:
+
+  ```js
+  // middleware.js
+  import { redirectToDefaultLocale } from 'astro:i18n';
+  export const onRequest = defineMiddleware(async (context, next) => {
+    if (context.url.startsWith('/about')) {
+      return next();
+    } else {
+      return redirectToDefaultLocale(context, 302);
+    }
+  });
+  ```
+
+  Also adds a `middleware` function that manually creates Astro's i18n middleware. This allows you to extend Astro's i18n routing instead of completely replacing it. Run `middleware` in combination with your own middleware, using the `sequence` utility to determine the order:
+
+  ```js title="src/middleware.js"
+  import { defineMiddleware, sequence } from 'astro:middleware';
+  import { middleware } from 'astro:i18n'; // Astro's own i18n routing config
+
+  export const userMiddleware = defineMiddleware();
+
+  export const onRequest = sequence(
+    userMiddleware,
+    middleware({
+      redirectToDefaultLocale: false,
+      prefixDefaultLocale: true,
+    })
+  );
+  ```
+
+- [#10671](https://github.com/withastro/astro/pull/10671) [`9e14a78cb05667af9821948c630786f74680090d`](https://github.com/withastro/astro/commit/9e14a78cb05667af9821948c630786f74680090d) Thanks [@fshafiee](https://github.com/fshafiee)! - Adds the `httpOnly`, `sameSite`, and `secure` options when deleting a cookie
+
+### Patch Changes
+
+- [#10747](https://github.com/withastro/astro/pull/10747) [`994337c99f84304df1147a14504659439a9a7326`](https://github.com/withastro/astro/commit/994337c99f84304df1147a14504659439a9a7326) Thanks [@lilnasy](https://github.com/lilnasy)! - Fixes an issue where functions could not be used as named slots.
+
+- [#10750](https://github.com/withastro/astro/pull/10750) [`7e825604ddf90c989537e07939a39dc249343897`](https://github.com/withastro/astro/commit/7e825604ddf90c989537e07939a39dc249343897) Thanks [@OliverSpeir](https://github.com/OliverSpeir)! - Fixes a false positive for "Invalid `tabindex` on non-interactive element" rule for roleless elements ( `div` and `span` ).
+
+- [#10745](https://github.com/withastro/astro/pull/10745) [`d51951ce6278d4b59deed938d65e1cb72b5102df`](https://github.com/withastro/astro/commit/d51951ce6278d4b59deed938d65e1cb72b5102df) Thanks [@lilnasy](https://github.com/lilnasy)! - Fixes an issue where CLI commands could not report the reason for failure before exiting.
+
+- [#10661](https://github.com/withastro/astro/pull/10661) [`e2cd7f4291912dadd4a654bc7917856c58a72a97`](https://github.com/withastro/astro/commit/e2cd7f4291912dadd4a654bc7917856c58a72a97) Thanks [@liruifengv](https://github.com/liruifengv)! - Fixed errorOverlay theme toggle bug.
+
+- Updated dependencies [[`ccafa8d230f65c9302421a0ce0a0adc5824bfd55`](https://github.com/withastro/astro/commit/ccafa8d230f65c9302421a0ce0a0adc5824bfd55), [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99)]:
+  - @astrojs/markdown-remark@5.1.0
+  - @astrojs/telemetry@3.1.0
+
 ## 4.5.18
 
 ### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 1365fc56e627..1f3463d8d181 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
 {
   "name": "astro",
-  "version": "4.5.18",
+  "version": "4.6.0",
   "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.",
   "type": "module",
   "author": "withastro",
diff --git a/packages/create-astro/CHANGELOG.md b/packages/create-astro/CHANGELOG.md
index 57bb2669efcf..d5e3320bb65c 100644
--- a/packages/create-astro/CHANGELOG.md
+++ b/packages/create-astro/CHANGELOG.md
@@ -1,5 +1,13 @@
 # create-astro
 
+## 4.8.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 4.7.5
 
 ### Patch Changes
diff --git a/packages/create-astro/package.json b/packages/create-astro/package.json
index 4b2fc5872d7e..c6822ccf5bef 100644
--- a/packages/create-astro/package.json
+++ b/packages/create-astro/package.json
@@ -1,6 +1,6 @@
 {
   "name": "create-astro",
-  "version": "4.7.5",
+  "version": "4.8.0",
   "type": "module",
   "author": "withastro",
   "license": "MIT",
diff --git a/packages/integrations/markdoc/CHANGELOG.md b/packages/integrations/markdoc/CHANGELOG.md
index 53b68a9eb025..83f7dae2fd93 100644
--- a/packages/integrations/markdoc/CHANGELOG.md
+++ b/packages/integrations/markdoc/CHANGELOG.md
@@ -1,5 +1,19 @@
 # @astrojs/markdoc
 
+## 0.10.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
+### Patch Changes
+
+- Updated dependencies [[`ccafa8d230f65c9302421a0ce0a0adc5824bfd55`](https://github.com/withastro/astro/commit/ccafa8d230f65c9302421a0ce0a0adc5824bfd55), [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99)]:
+  - @astrojs/markdown-remark@5.1.0
+  - @astrojs/prism@3.1.0
+
 ## 0.9.5
 
 ### Patch Changes
diff --git a/packages/integrations/markdoc/package.json b/packages/integrations/markdoc/package.json
index 883d61f30c7e..c928fbb200c4 100644
--- a/packages/integrations/markdoc/package.json
+++ b/packages/integrations/markdoc/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@astrojs/markdoc",
   "description": "Add support for Markdoc in your Astro site",
-  "version": "0.9.5",
+  "version": "0.10.0",
   "type": "module",
   "types": "./dist/index.d.ts",
   "author": "withastro",
diff --git a/packages/integrations/mdx/CHANGELOG.md b/packages/integrations/mdx/CHANGELOG.md
index e5bc40fa877b..105babf12f57 100644
--- a/packages/integrations/mdx/CHANGELOG.md
+++ b/packages/integrations/mdx/CHANGELOG.md
@@ -1,5 +1,18 @@
 # @astrojs/mdx
 
+## 2.3.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
+### Patch Changes
+
+- Updated dependencies [[`ccafa8d230f65c9302421a0ce0a0adc5824bfd55`](https://github.com/withastro/astro/commit/ccafa8d230f65c9302421a0ce0a0adc5824bfd55)]:
+  - @astrojs/markdown-remark@5.1.0
+
 ## 2.2.4
 
 ### Patch Changes
diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json
index 4fc7d2b9a1a3..ac9e775a66be 100644
--- a/packages/integrations/mdx/package.json
+++ b/packages/integrations/mdx/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@astrojs/mdx",
   "description": "Add support for MDX pages in your Astro site",
-  "version": "2.2.4",
+  "version": "2.3.0",
   "type": "module",
   "types": "./dist/index.d.ts",
   "author": "withastro",
diff --git a/packages/integrations/preact/CHANGELOG.md b/packages/integrations/preact/CHANGELOG.md
index 0d4f2c20731c..f9d76a983754 100644
--- a/packages/integrations/preact/CHANGELOG.md
+++ b/packages/integrations/preact/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/preact
 
+## 3.2.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 3.1.2
 
 ### Patch Changes
diff --git a/packages/integrations/preact/package.json b/packages/integrations/preact/package.json
index 9861046d1583..31256b838f00 100644
--- a/packages/integrations/preact/package.json
+++ b/packages/integrations/preact/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@astrojs/preact",
   "description": "Use Preact components within Astro",
-  "version": "3.1.2",
+  "version": "3.2.0",
   "type": "module",
   "types": "./dist/index.d.ts",
   "author": "withastro",
diff --git a/packages/integrations/react/CHANGELOG.md b/packages/integrations/react/CHANGELOG.md
index 97d33dad7876..aa8f833b6e08 100644
--- a/packages/integrations/react/CHANGELOG.md
+++ b/packages/integrations/react/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/react
 
+## 3.3.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 3.2.0
 
 ### Minor Changes
diff --git a/packages/integrations/react/package.json b/packages/integrations/react/package.json
index b7555bf28cc1..b69eb944953a 100644
--- a/packages/integrations/react/package.json
+++ b/packages/integrations/react/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@astrojs/react",
   "description": "Use React components within Astro",
-  "version": "3.2.0",
+  "version": "3.3.0",
   "type": "module",
   "types": "./dist/index.d.ts",
   "author": "withastro",
diff --git a/packages/integrations/solid/CHANGELOG.md b/packages/integrations/solid/CHANGELOG.md
index 560f87beb6dd..201de6445b3e 100644
--- a/packages/integrations/solid/CHANGELOG.md
+++ b/packages/integrations/solid/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/solid-js
 
+## 4.1.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 4.0.1
 
 ### Patch Changes
diff --git a/packages/integrations/solid/package.json b/packages/integrations/solid/package.json
index 819759a7b870..95e1bf194c47 100644
--- a/packages/integrations/solid/package.json
+++ b/packages/integrations/solid/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/solid-js",
-  "version": "4.0.1",
+  "version": "4.1.0",
   "description": "Use Solid components within Astro",
   "type": "module",
   "types": "./dist/index.d.ts",
diff --git a/packages/integrations/svelte/CHANGELOG.md b/packages/integrations/svelte/CHANGELOG.md
index a532cc744ccd..1a033facea34 100644
--- a/packages/integrations/svelte/CHANGELOG.md
+++ b/packages/integrations/svelte/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/svelte
 
+## 5.4.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 5.3.0
 
 ### Minor Changes
diff --git a/packages/integrations/svelte/package.json b/packages/integrations/svelte/package.json
index 0c7c77b50230..499a8bf84704 100644
--- a/packages/integrations/svelte/package.json
+++ b/packages/integrations/svelte/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/svelte",
-  "version": "5.3.0",
+  "version": "5.4.0",
   "description": "Use Svelte components within Astro",
   "type": "module",
   "types": "./dist/index.d.ts",
diff --git a/packages/integrations/vue/CHANGELOG.md b/packages/integrations/vue/CHANGELOG.md
index 8d050d16a5ef..e4fd2db610a7 100644
--- a/packages/integrations/vue/CHANGELOG.md
+++ b/packages/integrations/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/vue
 
+## 4.1.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 4.0.11
 
 ### Patch Changes
diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json
index 18f48bfff678..db48b34b3140 100644
--- a/packages/integrations/vue/package.json
+++ b/packages/integrations/vue/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/vue",
-  "version": "4.0.11",
+  "version": "4.1.0",
   "description": "Use Vue components within Astro",
   "type": "module",
   "types": "./dist/index.d.ts",
diff --git a/packages/markdown/remark/CHANGELOG.md b/packages/markdown/remark/CHANGELOG.md
index d90ae3f8de5f..916ff1210e1a 100644
--- a/packages/markdown/remark/CHANGELOG.md
+++ b/packages/markdown/remark/CHANGELOG.md
@@ -1,5 +1,54 @@
 # @astrojs/markdown-remark
 
+## 5.1.0
+
+### Minor Changes
+
+- [#10538](https://github.com/withastro/astro/pull/10538) [`ccafa8d230f65c9302421a0ce0a0adc5824bfd55`](https://github.com/withastro/astro/commit/ccafa8d230f65c9302421a0ce0a0adc5824bfd55) Thanks [@604qgc](https://github.com/604qgc)! - Adds a `data-language` attribute on the rendered `pre` elements to expose the highlighted syntax language.
+
+  For example, the following Markdown code block will expose `data-language="python"`:
+
+  ````
+  \```python
+  def func():
+      print('Hello Astro!')
+  \```
+  ````
+
+  This allows retrieving the language in a rehype plugin from `node.properties.dataLanguage` by accessing the `
` element using `{ tagName: "pre" }`:
+
+  ```js
+  // myRehypePre.js
+  import { visit } from "unist-util-visit";
+  export default function myRehypePre() {
+    return (tree) => {
+      visit(tree, { tagName: "pre" }, (node) => {
+        const lang = node.properties.dataLanguage;
+        [...]
+      });
+    };
+  }
+  ```
+
+  Note: The `
` element is not exposed when using Astro's `` component which outputs flattened HTML.
+
+  The `data-language` attribute may also be used in css rules:
+
+  ```css
+  pre::before {
+    content: attr(data-language);
+  }
+
+  pre[data-language='javascript'] {
+    font-size: 2rem;
+  }
+  ```
+
+### Patch Changes
+
+- Updated dependencies [[`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99)]:
+  - @astrojs/prism@3.1.0
+
 ## 5.0.0
 
 ### Major Changes
diff --git a/packages/markdown/remark/package.json b/packages/markdown/remark/package.json
index 19df22236899..5e2c8975c78e 100644
--- a/packages/markdown/remark/package.json
+++ b/packages/markdown/remark/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/markdown-remark",
-  "version": "5.0.0",
+  "version": "5.1.0",
   "type": "module",
   "author": "withastro",
   "license": "MIT",
@@ -34,7 +34,7 @@
     "test": "astro-scripts test \"test/**/*.test.js\""
   },
   "dependencies": {
-    "@astrojs/prism": "^3.0.0",
+    "@astrojs/prism": "^3.1.0",
     "github-slugger": "^2.0.0",
     "hast-util-from-html": "^2.0.0",
     "hast-util-to-text": "^4.0.0",
diff --git a/packages/telemetry/CHANGELOG.md b/packages/telemetry/CHANGELOG.md
index 1d4cdff53cd4..b6c39c3b3ef0 100644
--- a/packages/telemetry/CHANGELOG.md
+++ b/packages/telemetry/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/telemetry
 
+## 3.1.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 3.0.4
 
 ### Patch Changes
diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json
index d325fec14eb7..9c4d269bfcf2 100644
--- a/packages/telemetry/package.json
+++ b/packages/telemetry/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/telemetry",
-  "version": "3.0.4",
+  "version": "3.1.0",
   "type": "module",
   "types": "./dist/index.d.ts",
   "author": "withastro",
diff --git a/packages/upgrade/CHANGELOG.md b/packages/upgrade/CHANGELOG.md
index 2f68c8428b3d..8689cbe8def9 100644
--- a/packages/upgrade/CHANGELOG.md
+++ b/packages/upgrade/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/upgrade
 
+## 0.3.0
+
+### Minor Changes
+
+- [#10689](https://github.com/withastro/astro/pull/10689) [`683d51a5eecafbbfbfed3910a3f1fbf0b3531b99`](https://github.com/withastro/astro/commit/683d51a5eecafbbfbfed3910a3f1fbf0b3531b99) Thanks [@ematipico](https://github.com/ematipico)! - Deprecate support for versions of Node.js older than `v18.17.1` for Node.js 18, older than `v20.0.3` for Node.js 20, and the complete Node.js v19 release line.
+
+  This change is in line with Astro's [Node.js support policy](https://docs.astro.build/en/upgrade-astro/#support).
+
 ## 0.2.3
 
 ### Patch Changes
diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json
index 4869b0b0b420..9612dbbfbfdc 100644
--- a/packages/upgrade/package.json
+++ b/packages/upgrade/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/upgrade",
-  "version": "0.2.3",
+  "version": "0.3.0",
   "type": "module",
   "author": "withastro",
   "license": "MIT",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2061cfefe5f5..952e1aa2f05d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -134,13 +134,13 @@ importers:
   examples/basics:
     dependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/blog:
     dependencies:
       '@astrojs/mdx':
-        specifier: ^2.2.4
+        specifier: ^2.3.0
         version: link:../../packages/integrations/mdx
       '@astrojs/rss':
         specifier: ^4.0.5
@@ -149,13 +149,13 @@ importers:
         specifier: ^3.1.2
         version: link:../../packages/integrations/sitemap
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/component:
     devDependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/framework-alpine:
@@ -170,7 +170,7 @@ importers:
         specifier: ^3.13.3
         version: 3.13.8
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/framework-lit:
@@ -182,7 +182,7 @@ importers:
         specifier: ^0.2.1
         version: 0.2.1
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       lit:
         specifier: ^3.1.2
@@ -191,19 +191,19 @@ importers:
   examples/framework-multiple:
     dependencies:
       '@astrojs/preact':
-        specifier: ^3.1.2
+        specifier: ^3.2.0
         version: link:../../packages/integrations/preact
       '@astrojs/react':
-        specifier: ^3.2.0
+        specifier: ^3.3.0
         version: link:../../packages/integrations/react
       '@astrojs/solid-js':
-        specifier: ^4.0.1
+        specifier: ^4.1.0
         version: link:../../packages/integrations/solid
       '@astrojs/svelte':
-        specifier: ^5.3.0
+        specifier: ^5.4.0
         version: link:../../packages/integrations/svelte
       '@astrojs/vue':
-        specifier: ^4.0.11
+        specifier: ^4.1.0
         version: link:../../packages/integrations/vue
       '@types/react':
         specifier: ^18.2.37
@@ -212,7 +212,7 @@ importers:
         specifier: ^18.2.15
         version: 18.2.24
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
@@ -236,13 +236,13 @@ importers:
   examples/framework-preact:
     dependencies:
       '@astrojs/preact':
-        specifier: ^3.1.2
+        specifier: ^3.2.0
         version: link:../../packages/integrations/preact
       '@preact/signals':
         specifier: ^1.2.1
         version: 1.2.1(preact@10.20.1)
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
@@ -251,7 +251,7 @@ importers:
   examples/framework-react:
     dependencies:
       '@astrojs/react':
-        specifier: ^3.2.0
+        specifier: ^3.3.0
         version: link:../../packages/integrations/react
       '@types/react':
         specifier: ^18.2.37
@@ -260,7 +260,7 @@ importers:
         specifier: ^18.2.15
         version: 18.2.24
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       react:
         specifier: ^18.2.0
@@ -272,10 +272,10 @@ importers:
   examples/framework-solid:
     dependencies:
       '@astrojs/solid-js':
-        specifier: ^4.0.1
+        specifier: ^4.1.0
         version: link:../../packages/integrations/solid
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       solid-js:
         specifier: ^1.8.5
@@ -284,10 +284,10 @@ importers:
   examples/framework-svelte:
     dependencies:
       '@astrojs/svelte':
-        specifier: ^5.3.0
+        specifier: ^5.4.0
         version: link:../../packages/integrations/svelte
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       svelte:
         specifier: ^4.2.5
@@ -296,10 +296,10 @@ importers:
   examples/framework-vue:
     dependencies:
       '@astrojs/vue':
-        specifier: ^4.0.11
+        specifier: ^4.1.0
         version: link:../../packages/integrations/vue
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       vue:
         specifier: ^3.3.8
@@ -311,13 +311,13 @@ importers:
         specifier: ^8.2.5
         version: link:../../packages/integrations/node
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/integration:
     devDependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/middleware:
@@ -326,7 +326,7 @@ importers:
         specifier: ^8.2.5
         version: link:../../packages/integrations/node
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       html-minifier:
         specifier: ^4.0.0
@@ -339,19 +339,19 @@ importers:
   examples/minimal:
     dependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/non-html-pages:
     dependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/portfolio:
     dependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/ssr:
@@ -360,10 +360,10 @@ importers:
         specifier: ^8.2.5
         version: link:../../packages/integrations/node
       '@astrojs/svelte':
-        specifier: ^5.3.0
+        specifier: ^5.4.0
         version: link:../../packages/integrations/svelte
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       svelte:
         specifier: ^4.2.5
@@ -372,7 +372,7 @@ importers:
   examples/starlog:
     dependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       sass:
         specifier: ^1.69.5
@@ -390,25 +390,25 @@ importers:
         specifier: ^5.1.0
         version: link:../../packages/integrations/tailwind
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/with-markdoc:
     dependencies:
       '@astrojs/markdoc':
-        specifier: ^0.9.5
+        specifier: ^0.10.0
         version: link:../../packages/integrations/markdoc
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/with-markdown-plugins:
     dependencies:
       '@astrojs/markdown-remark':
-        specifier: ^5.0.0
+        specifier: ^5.1.0
         version: link:../../packages/markdown/remark
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       hast-util-select:
         specifier: ^6.0.2
@@ -429,19 +429,19 @@ importers:
   examples/with-markdown-shiki:
     dependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
 
   examples/with-mdx:
     dependencies:
       '@astrojs/mdx':
-        specifier: ^2.2.4
+        specifier: ^2.3.0
         version: link:../../packages/integrations/mdx
       '@astrojs/preact':
-        specifier: ^3.1.2
+        specifier: ^3.2.0
         version: link:../../packages/integrations/preact
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
@@ -450,13 +450,13 @@ importers:
   examples/with-nanostores:
     dependencies:
       '@astrojs/preact':
-        specifier: ^3.1.2
+        specifier: ^3.2.0
         version: link:../../packages/integrations/preact
       '@nanostores/preact':
         specifier: ^0.5.0
         version: 0.5.1(nanostores@0.9.5)(preact@10.20.1)
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       nanostores:
         specifier: ^0.9.5
@@ -468,7 +468,7 @@ importers:
   examples/with-tailwindcss:
     dependencies:
       '@astrojs/mdx':
-        specifier: ^2.2.4
+        specifier: ^2.3.0
         version: link:../../packages/integrations/mdx
       '@astrojs/tailwind':
         specifier: ^5.1.0
@@ -477,7 +477,7 @@ importers:
         specifier: ^1.6.3
         version: 1.6.4
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       autoprefixer:
         specifier: ^10.4.15
@@ -495,7 +495,7 @@ importers:
   examples/with-vitest:
     dependencies:
       astro:
-        specifier: ^4.5.18
+        specifier: ^4.6.0
         version: link:../../packages/astro
       vitest:
         specifier: ^1.3.1
@@ -5333,7 +5333,7 @@ importers:
   packages/markdown/remark:
     dependencies:
       '@astrojs/prism':
-        specifier: ^3.0.0
+        specifier: ^3.1.0
         version: link:../../astro-prism
       github-slugger:
         specifier: ^2.0.0

From 432369a9c6bea7a4d78a5f016b69080c6f85074b Mon Sep 17 00:00:00 2001
From: Emanuele Stoppa 
Date: Thu, 11 Apr 2024 14:51:10 +0100
Subject: [PATCH 52/96] fix(i18n): fallback SSR (#10755)

* fix(i18n): fallback SSR

* Update .changeset/old-pugs-jog.md

Co-authored-by: Florian Lefebvre 

---------

Co-authored-by: Florian Lefebvre 
---
 .changeset/old-pugs-jog.md               |  5 ++++
 packages/astro/src/i18n/index.ts         |  7 ++++-
 packages/astro/src/i18n/middleware.ts    |  1 -
 packages/astro/test/i18n-routing.test.js | 33 ++++++++++++++++++++++++
 4 files changed, 44 insertions(+), 2 deletions(-)
 create mode 100644 .changeset/old-pugs-jog.md

diff --git a/.changeset/old-pugs-jog.md b/.changeset/old-pugs-jog.md
new file mode 100644
index 000000000000..3d56f9e040ba
--- /dev/null
+++ b/.changeset/old-pugs-jog.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes a case where the i18n fallback failed to correctly redirect to the index page with SSR enabled
diff --git a/packages/astro/src/i18n/index.ts b/packages/astro/src/i18n/index.ts
index 32cd24f9cff0..b8114019bdcf 100644
--- a/packages/astro/src/i18n/index.ts
+++ b/packages/astro/src/i18n/index.ts
@@ -343,6 +343,7 @@ export function redirectToFallback({
 	locales,
 	defaultLocale,
 	strategy,
+	base,
 }: MiddlewarePayload) {
 	return function (context: APIContext, response: Response): Response {
 		if (response.status >= 300 && fallback) {
@@ -370,7 +371,11 @@ export function redirectToFallback({
 				// If a locale falls back to the default locale, we want to **remove** the locale because
 				// the default locale doesn't have a prefix
 				if (pathFallbackLocale === defaultLocale && strategy === 'pathname-prefix-other-locales') {
-					newPathname = context.url.pathname.replace(`/${urlLocale}`, ``);
+					if (context.url.pathname.includes(`${base}`)) {
+						newPathname = context.url.pathname.replace(`/${urlLocale}`, ``);
+					} else {
+						newPathname = context.url.pathname.replace(`/${urlLocale}`, `/`);
+					}
 				} else {
 					newPathname = context.url.pathname.replace(`/${urlLocale}`, `/${pathFallbackLocale}`);
 				}
diff --git a/packages/astro/src/i18n/middleware.ts b/packages/astro/src/i18n/middleware.ts
index 42c0f0e763df..df5d63761c74 100644
--- a/packages/astro/src/i18n/middleware.ts
+++ b/packages/astro/src/i18n/middleware.ts
@@ -3,7 +3,6 @@ import type { SSRManifestI18n } from '../core/app/types.js';
 import { ROUTE_TYPE_HEADER } from '../core/constants.js';
 import {
 	type MiddlewarePayload,
-	getPathByLocale,
 	normalizeTheLocale,
 	notFound,
 	redirectToDefaultLocale,
diff --git a/packages/astro/test/i18n-routing.test.js b/packages/astro/test/i18n-routing.test.js
index 6e1503819b40..609af16f8421 100644
--- a/packages/astro/test/i18n-routing.test.js
+++ b/packages/astro/test/i18n-routing.test.js
@@ -1871,3 +1871,36 @@ describe('i18n routing does not break assets and endpoints', () => {
 		});
 	});
 });
+
+describe('SSR fallback from missing locale index to default locale index', () => {
+	/** @type {import('./test-utils').Fixture} */
+	let fixture;
+	let app;
+
+	before(async () => {
+		fixture = await loadFixture({
+			root: './fixtures/i18n-routing-prefix-other-locales/',
+			output: 'server',
+			adapter: testAdapter(),
+			i18n: {
+				defaultLocale: 'en',
+				locales: ['en', 'fr'],
+				routing: {
+					prefixDefaultLocale: false,
+				},
+				fallback: {
+					fr: 'en',
+				},
+			},
+		});
+		await fixture.build();
+		app = await fixture.loadTestAdapterApp();
+	});
+
+	it('should correctly redirect', async () => {
+		let request = new Request('http://example.com/fr');
+		let response = await app.render(request);
+		assert.equal(response.status, 302);
+		assert.equal(response.headers.get('location'), '/');
+	});
+});

From 654f5dc54b11512c74bcee4638bad7cb5cbdf17d Mon Sep 17 00:00:00 2001
From: Sarah Rainsberger 
Date: Thu, 11 Apr 2024 11:38:03 -0300
Subject: [PATCH 53/96] [docs] config reference link fix (#10758)

---
 packages/astro/src/@types/astro.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts
index 0650f901b9f2..a695ab2b7d2e 100644
--- a/packages/astro/src/@types/astro.ts
+++ b/packages/astro/src/@types/astro.ts
@@ -1857,7 +1857,7 @@ export interface AstroUserConfig {
 		 * });
 		 * ```
 		 *
-		 * Both page routes built and URLs returned by the `astro:i18n` helper functions [`getAbsoluteLocaleUrl()`](https://docs.astro.build/en/guides/internationalization/#getabsolutelocaleurl) and [`getAbsoluteLocaleUrlList()`](https://docs.astro.build/en/guides/internationalization/#getabsolutelocaleurllist) will use the options set in `i18n.domains`.
+		 * Both page routes built and URLs returned by the `astro:i18n` helper functions [`getAbsoluteLocaleUrl()`](https://docs.astro.build/en/reference/api-reference/#getabsolutelocaleurl) and [`getAbsoluteLocaleUrlList()`](https://docs.astro.build/en/reference/api-reference/#getabsolutelocaleurllist) will use the options set in `i18n.domains`.
 		 *
 		 * See the [Internationalization Guide](https://docs.astro.build/en/guides/internationalization/#domains-experimental) for more details, including the limitations of this experimental feature.
 		 */

From dcf13b13a664ada46af2b3add83e4fbbf06c7fdf Mon Sep 17 00:00:00 2001
From: horo <143025439+horo-fox@users.noreply.github.com>
Date: Thu, 11 Apr 2024 23:40:14 +0900
Subject: [PATCH 54/96] Limit imports in flight for `getCollection` (#10708)

---
 .changeset/four-zoos-taste.md         | 5 +++++
 packages/astro/src/content/runtime.ts | 6 ++++--
 2 files changed, 9 insertions(+), 2 deletions(-)
 create mode 100644 .changeset/four-zoos-taste.md

diff --git a/.changeset/four-zoos-taste.md b/.changeset/four-zoos-taste.md
new file mode 100644
index 000000000000..6078bcdadb6e
--- /dev/null
+++ b/.changeset/four-zoos-taste.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Limits parallel imports within `getCollection()` to prevent EMFILE errors when accessing files
diff --git a/packages/astro/src/content/runtime.ts b/packages/astro/src/content/runtime.ts
index 8fcbc919104c..0ad74de3e537 100644
--- a/packages/astro/src/content/runtime.ts
+++ b/packages/astro/src/content/runtime.ts
@@ -1,4 +1,5 @@
 import type { MarkdownHeading } from '@astrojs/markdown-remark';
+import pLimit from 'p-limit';
 import { ZodIssueCode, string as zodString } from 'zod';
 import { AstroError, AstroErrorData } from '../core/errors/index.js';
 import { prependForwardSlash } from '../core/path.js';
@@ -80,8 +81,9 @@ export function createGetCollection({
 			// Always return a new instance so consumers can safely mutate it
 			entries = [...cacheEntriesByCollection.get(collection)!];
 		} else {
+			const limit = pLimit(10);
 			entries = await Promise.all(
-				lazyImports.map(async (lazyImport) => {
+				lazyImports.map((lazyImport) => limit(async () => {
 					const entry = await lazyImport();
 					return type === 'content'
 						? {
@@ -103,7 +105,7 @@ export function createGetCollection({
 								collection: entry.collection,
 								data: entry.data,
 							};
-				})
+				}))
 			);
 			cacheEntriesByCollection.set(collection, entries);
 		}

From f6df35c6e1293c7a45a9510d57a3e815b1e01a60 Mon Sep 17 00:00:00 2001
From: horo 
Date: Thu, 11 Apr 2024 14:41:22 +0000
Subject: [PATCH 55/96] [ci] format

---
 packages/astro/src/content/runtime.ts | 48 ++++++++++++++-------------
 1 file changed, 25 insertions(+), 23 deletions(-)

diff --git a/packages/astro/src/content/runtime.ts b/packages/astro/src/content/runtime.ts
index 0ad74de3e537..c4fc8573910b 100644
--- a/packages/astro/src/content/runtime.ts
+++ b/packages/astro/src/content/runtime.ts
@@ -83,29 +83,31 @@ export function createGetCollection({
 		} else {
 			const limit = pLimit(10);
 			entries = await Promise.all(
-				lazyImports.map((lazyImport) => limit(async () => {
-					const entry = await lazyImport();
-					return type === 'content'
-						? {
-								id: entry.id,
-								slug: entry.slug,
-								body: entry.body,
-								collection: entry.collection,
-								data: entry.data,
-								async render() {
-									return render({
-										collection: entry.collection,
-										id: entry.id,
-										renderEntryImport: await getRenderEntryImport(collection, entry.slug),
-									});
-								},
-							}
-						: {
-								id: entry.id,
-								collection: entry.collection,
-								data: entry.data,
-							};
-				}))
+				lazyImports.map((lazyImport) =>
+					limit(async () => {
+						const entry = await lazyImport();
+						return type === 'content'
+							? {
+									id: entry.id,
+									slug: entry.slug,
+									body: entry.body,
+									collection: entry.collection,
+									data: entry.data,
+									async render() {
+										return render({
+											collection: entry.collection,
+											id: entry.id,
+											renderEntryImport: await getRenderEntryImport(collection, entry.slug),
+										});
+									},
+								}
+							: {
+									id: entry.id,
+									collection: entry.collection,
+									data: entry.data,
+								};
+					})
+				)
 			);
 			cacheEntriesByCollection.set(collection, entries);
 		}

From 9f37f2d09d41f728168000c082f8519f01fc9363 Mon Sep 17 00:00:00 2001
From: Chris Swithinbank 
Date: Thu, 11 Apr 2024 23:18:57 +0200
Subject: [PATCH 56/96] Add useful links to `@astrojs/db` package.json (#10764)

Co-authored-by: Reuben Tier <64310361+TheOtterlord@users.noreply.github.com>
---
 .changeset/grumpy-moose-pretend.md | 5 +++++
 packages/db/package.json           | 9 ++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/grumpy-moose-pretend.md

diff --git a/.changeset/grumpy-moose-pretend.md b/.changeset/grumpy-moose-pretend.md
new file mode 100644
index 000000000000..899323735623
--- /dev/null
+++ b/.changeset/grumpy-moose-pretend.md
@@ -0,0 +1,5 @@
+---
+"@astrojs/db": patch
+---
+
+Improves `package.json` metadata fields
diff --git a/packages/db/package.json b/packages/db/package.json
index e58bf32b8f9b..68149f69bbd9 100644
--- a/packages/db/package.json
+++ b/packages/db/package.json
@@ -1,8 +1,15 @@
 {
   "name": "@astrojs/db",
   "version": "0.10.3",
-  "description": "",
+  "description": "Add libSQL and Astro Studio support to your Astro site",
   "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/withastro/astro.git",
+    "directory": "packages/db"
+  },
+  "bugs": "https://github.com/withastro/astro/issues",
+  "homepage": "https://docs.astro.build/en/guides/integrations-guide/db/",
   "type": "module",
   "author": "withastro",
   "types": "./index.d.ts",

From b9b790056b2fa579294df02844d98c49a8db5dad Mon Sep 17 00:00:00 2001
From: Leander Gilles 
Date: Fri, 12 Apr 2024 08:17:42 +0200
Subject: [PATCH 57/96] Performance improvement in createAstro function
 (#10765)

---
 packages/astro/src/core/render-context.ts | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts
index 4155de863db6..eb05df6f5db6 100644
--- a/packages/astro/src/core/render-context.ts
+++ b/packages/astro/src/core/render-context.ts
@@ -264,7 +264,8 @@ export class RenderContext {
 
 		// `Astro.self` is added by the compiler
 		const astroGlobalCombined: Omit = {
-			...astroGlobalPartial,
+			generator: astroGlobalPartial.generator,
+			glob: astroGlobalPartial.glob,
 			cookies,
 			get clientAddress() {
 				return renderContext.clientAddress();

From e15babedd4154f176a2824c0f2ace6f03dac3eaf Mon Sep 17 00:00:00 2001
From: liruifengv 
Date: Fri, 12 Apr 2024 15:07:07 +0800
Subject: [PATCH 58/96] Fix typo in error message for IncorrectStrategyForI18n
 (#10768)

---
 packages/astro/src/core/errors/errors-data.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/astro/src/core/errors/errors-data.ts b/packages/astro/src/core/errors/errors-data.ts
index e18221c428f1..6cb22cc00e99 100644
--- a/packages/astro/src/core/errors/errors-data.ts
+++ b/packages/astro/src/core/errors/errors-data.ts
@@ -1079,7 +1079,7 @@ export const IncorrectStrategyForI18n = {
 	name: 'IncorrectStrategyForI18n',
 	title: "You can't use the current function with the current strategy",
 	message: (functionName: string) =>
-		`The function \`${functionName}\' can only be used when the \`i18n.routing.strategy\` is set to \`"manual"\`.`,
+		`The function \`${functionName}\` can only be used when the \`i18n.routing.strategy\` is set to \`"manual"\`.`,
 } satisfies ErrorData;
 
 /**

From a2e385ad40228e32f946224f18e53d63f9dd6d4c Mon Sep 17 00:00:00 2001
From: Erika <3019731+Princesseuh@users.noreply.github.com>
Date: Fri, 12 Apr 2024 10:07:27 -0400
Subject: [PATCH 59/96] fix(vercel): Fix srcset generation not working on
 Vercel (#10756)

* fix(vercel): Fix `srcset` generation not working on Vercel

* chore: changeset

* fix: remove densities and widths from the HTML attributes

* nit: better changeset

* nit: add formats
---
 .changeset/nine-radios-peel.md                             | 7 +++++++
 packages/integrations/vercel/src/image/build-service.ts    | 4 +++-
 .../integrations/vercel/src/image/shared-dev-service.ts    | 2 ++
 3 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/nine-radios-peel.md

diff --git a/.changeset/nine-radios-peel.md b/.changeset/nine-radios-peel.md
new file mode 100644
index 000000000000..fece80eb9f3b
--- /dev/null
+++ b/.changeset/nine-radios-peel.md
@@ -0,0 +1,7 @@
+---
+"@astrojs/vercel": patch
+---
+
+Fixes `widths` and `densities` not working when using Vercel's Image Optimization.
+
+Note that you still need to make sure that the widths you're outputting are enabled in [the `imageConfig` property of the Vercel adapter](https://docs.astro.build/en/guides/integrations-guide/vercel/#imagesconfig) in order for these properties to work.
diff --git a/packages/integrations/vercel/src/image/build-service.ts b/packages/integrations/vercel/src/image/build-service.ts
index bd58d3af61ce..7e991161ad3d 100644
--- a/packages/integrations/vercel/src/image/build-service.ts
+++ b/packages/integrations/vercel/src/image/build-service.ts
@@ -1,7 +1,9 @@
 import type { ExternalImageService } from 'astro';
 import { isESMImportedImage, sharedValidateOptions } from './shared.js';
+import { baseService } from 'astro/assets';
 
 const service: ExternalImageService = {
+	...baseService,
 	validateOptions: (options, serviceOptions) =>
 		sharedValidateOptions(options, serviceOptions.service.config, 'production'),
 	getHTMLAttributes(options) {
@@ -29,7 +31,7 @@ const service: ExternalImageService = {
 			}
 		}
 
-		const { src, width, height, format, quality, ...attributes } = props;
+		const { src, width, height, format, quality, densities, widths, formats, ...attributes } = options;
 
 		return {
 			...attributes,
diff --git a/packages/integrations/vercel/src/image/shared-dev-service.ts b/packages/integrations/vercel/src/image/shared-dev-service.ts
index 4251603a704c..8ca87e99aaa9 100644
--- a/packages/integrations/vercel/src/image/shared-dev-service.ts
+++ b/packages/integrations/vercel/src/image/shared-dev-service.ts
@@ -1,7 +1,9 @@
 import type { LocalImageService } from 'astro';
+import { baseService } from 'astro/assets';
 import { sharedValidateOptions } from './shared.js';
 
 export const baseDevService: Omit = {
+	...baseService,
 	validateOptions: (options, serviceOptions) =>
 		sharedValidateOptions(options, serviceOptions.service.config, 'development'),
 	getURL(options) {

From 3ed1d95af15edbf6c6006db16bf7c88ab89a47f1 Mon Sep 17 00:00:00 2001
From: Erika 
Date: Fri, 12 Apr 2024 14:09:03 +0000
Subject: [PATCH 60/96] [ci] format

---
 packages/integrations/vercel/src/image/build-service.ts | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/packages/integrations/vercel/src/image/build-service.ts b/packages/integrations/vercel/src/image/build-service.ts
index 7e991161ad3d..e793b896e4d1 100644
--- a/packages/integrations/vercel/src/image/build-service.ts
+++ b/packages/integrations/vercel/src/image/build-service.ts
@@ -1,6 +1,6 @@
 import type { ExternalImageService } from 'astro';
-import { isESMImportedImage, sharedValidateOptions } from './shared.js';
 import { baseService } from 'astro/assets';
+import { isESMImportedImage, sharedValidateOptions } from './shared.js';
 
 const service: ExternalImageService = {
 	...baseService,
@@ -31,7 +31,8 @@ const service: ExternalImageService = {
 			}
 		}
 
-		const { src, width, height, format, quality, densities, widths, formats, ...attributes } = options;
+		const { src, width, height, format, quality, densities, widths, formats, ...attributes } =
+			options;
 
 		return {
 			...attributes,

From 197d67e5dc0116955fd591ab887913098b4bd2c9 Mon Sep 17 00:00:00 2001
From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com>
Date: Fri, 12 Apr 2024 08:31:46 -0700
Subject: [PATCH 61/96] [ci] release (#10757)

Co-authored-by: github-actions[bot] 
---
 .changeset/four-zoos-taste.md               |  5 --
 .changeset/grumpy-moose-pretend.md          |  5 --
 .changeset/nine-radios-peel.md              |  7 ---
 .changeset/old-pugs-jog.md                  |  5 --
 examples/basics/package.json                |  2 +-
 examples/blog/package.json                  |  2 +-
 examples/component/package.json             |  2 +-
 examples/framework-alpine/package.json      |  2 +-
 examples/framework-lit/package.json         |  2 +-
 examples/framework-multiple/package.json    |  2 +-
 examples/framework-preact/package.json      |  2 +-
 examples/framework-react/package.json       |  2 +-
 examples/framework-solid/package.json       |  2 +-
 examples/framework-svelte/package.json      |  2 +-
 examples/framework-vue/package.json         |  2 +-
 examples/hackernews/package.json            |  2 +-
 examples/integration/package.json           |  2 +-
 examples/middleware/package.json            |  2 +-
 examples/minimal/package.json               |  2 +-
 examples/non-html-pages/package.json        |  2 +-
 examples/portfolio/package.json             |  2 +-
 examples/ssr/package.json                   |  2 +-
 examples/starlog/package.json               |  2 +-
 examples/view-transitions/package.json      |  2 +-
 examples/with-markdoc/package.json          |  2 +-
 examples/with-markdown-plugins/package.json |  2 +-
 examples/with-markdown-shiki/package.json   |  2 +-
 examples/with-mdx/package.json              |  2 +-
 examples/with-nanostores/package.json       |  2 +-
 examples/with-tailwindcss/package.json      |  2 +-
 examples/with-vitest/package.json           |  2 +-
 packages/astro/CHANGELOG.md                 |  8 +++
 packages/astro/package.json                 |  2 +-
 packages/db/CHANGELOG.md                    |  6 +++
 packages/db/package.json                    |  2 +-
 packages/integrations/vercel/CHANGELOG.md   |  8 +++
 packages/integrations/vercel/package.json   |  2 +-
 pnpm-lock.yaml                              | 54 ++++++++++-----------
 38 files changed, 79 insertions(+), 79 deletions(-)
 delete mode 100644 .changeset/four-zoos-taste.md
 delete mode 100644 .changeset/grumpy-moose-pretend.md
 delete mode 100644 .changeset/nine-radios-peel.md
 delete mode 100644 .changeset/old-pugs-jog.md

diff --git a/.changeset/four-zoos-taste.md b/.changeset/four-zoos-taste.md
deleted file mode 100644
index 6078bcdadb6e..000000000000
--- a/.changeset/four-zoos-taste.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"astro": patch
----
-
-Limits parallel imports within `getCollection()` to prevent EMFILE errors when accessing files
diff --git a/.changeset/grumpy-moose-pretend.md b/.changeset/grumpy-moose-pretend.md
deleted file mode 100644
index 899323735623..000000000000
--- a/.changeset/grumpy-moose-pretend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@astrojs/db": patch
----
-
-Improves `package.json` metadata fields
diff --git a/.changeset/nine-radios-peel.md b/.changeset/nine-radios-peel.md
deleted file mode 100644
index fece80eb9f3b..000000000000
--- a/.changeset/nine-radios-peel.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-"@astrojs/vercel": patch
----
-
-Fixes `widths` and `densities` not working when using Vercel's Image Optimization.
-
-Note that you still need to make sure that the widths you're outputting are enabled in [the `imageConfig` property of the Vercel adapter](https://docs.astro.build/en/guides/integrations-guide/vercel/#imagesconfig) in order for these properties to work.
diff --git a/.changeset/old-pugs-jog.md b/.changeset/old-pugs-jog.md
deleted file mode 100644
index 3d56f9e040ba..000000000000
--- a/.changeset/old-pugs-jog.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"astro": patch
----
-
-Fixes a case where the i18n fallback failed to correctly redirect to the index page with SSR enabled
diff --git a/examples/basics/package.json b/examples/basics/package.json
index e6967359976c..e32ef884cb3e 100644
--- a/examples/basics/package.json
+++ b/examples/basics/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/blog/package.json b/examples/blog/package.json
index 03925559a3a6..f7e1d6b4b8a2 100644
--- a/examples/blog/package.json
+++ b/examples/blog/package.json
@@ -14,6 +14,6 @@
     "@astrojs/mdx": "^2.3.0",
     "@astrojs/rss": "^4.0.5",
     "@astrojs/sitemap": "^3.1.2",
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/component/package.json b/examples/component/package.json
index 422950059d17..e4bbfe2e9459 100644
--- a/examples/component/package.json
+++ b/examples/component/package.json
@@ -15,7 +15,7 @@
   ],
   "scripts": {},
   "devDependencies": {
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   },
   "peerDependencies": {
     "astro": "^4.0.0"
diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json
index c8d8d8655397..f731ddf0ff86 100644
--- a/examples/framework-alpine/package.json
+++ b/examples/framework-alpine/package.json
@@ -14,6 +14,6 @@
     "@astrojs/alpinejs": "^0.4.0",
     "@types/alpinejs": "^3.13.5",
     "alpinejs": "^3.13.3",
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json
index 407d65877b65..4cfbb0e05757 100644
--- a/examples/framework-lit/package.json
+++ b/examples/framework-lit/package.json
@@ -13,7 +13,7 @@
   "dependencies": {
     "@astrojs/lit": "^4.0.1",
     "@webcomponents/template-shadowroot": "^0.2.1",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "lit": "^3.1.2"
   }
 }
diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json
index 43ded5197100..5f8d13af7168 100644
--- a/examples/framework-multiple/package.json
+++ b/examples/framework-multiple/package.json
@@ -18,7 +18,7 @@
     "@astrojs/vue": "^4.1.0",
     "@types/react": "^18.2.37",
     "@types/react-dom": "^18.2.15",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "preact": "^10.19.2",
     "react": "^18.2.0",
     "react-dom": "^18.2.0",
diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json
index 870bd442e740..f36f406a5e20 100644
--- a/examples/framework-preact/package.json
+++ b/examples/framework-preact/package.json
@@ -13,7 +13,7 @@
   "dependencies": {
     "@astrojs/preact": "^3.2.0",
     "@preact/signals": "^1.2.1",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "preact": "^10.19.2"
   }
 }
diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json
index 3ea028b46da0..205b05d6a9e3 100644
--- a/examples/framework-react/package.json
+++ b/examples/framework-react/package.json
@@ -14,7 +14,7 @@
     "@astrojs/react": "^3.3.0",
     "@types/react": "^18.2.37",
     "@types/react-dom": "^18.2.15",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "react": "^18.2.0",
     "react-dom": "^18.2.0"
   }
diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json
index 0695f05c1c35..bed80c53f211 100644
--- a/examples/framework-solid/package.json
+++ b/examples/framework-solid/package.json
@@ -12,7 +12,7 @@
   },
   "dependencies": {
     "@astrojs/solid-js": "^4.1.0",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "solid-js": "^1.8.5"
   }
 }
diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json
index bc2f8ce3d3aa..d41823b0404d 100644
--- a/examples/framework-svelte/package.json
+++ b/examples/framework-svelte/package.json
@@ -12,7 +12,7 @@
   },
   "dependencies": {
     "@astrojs/svelte": "^5.4.0",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "svelte": "^4.2.5"
   }
 }
diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json
index f6044a9075a7..28bab6c81c41 100644
--- a/examples/framework-vue/package.json
+++ b/examples/framework-vue/package.json
@@ -12,7 +12,7 @@
   },
   "dependencies": {
     "@astrojs/vue": "^4.1.0",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "vue": "^3.3.8"
   }
 }
diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json
index 3c45703a6643..599a3a1c8eab 100644
--- a/examples/hackernews/package.json
+++ b/examples/hackernews/package.json
@@ -12,6 +12,6 @@
   },
   "dependencies": {
     "@astrojs/node": "^8.2.5",
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/integration/package.json b/examples/integration/package.json
index f9b5103cea22..91f5793991b7 100644
--- a/examples/integration/package.json
+++ b/examples/integration/package.json
@@ -15,7 +15,7 @@
   ],
   "scripts": {},
   "devDependencies": {
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   },
   "peerDependencies": {
     "astro": "^4.0.0"
diff --git a/examples/middleware/package.json b/examples/middleware/package.json
index d078dcaee950..cb608654a3dd 100644
--- a/examples/middleware/package.json
+++ b/examples/middleware/package.json
@@ -13,7 +13,7 @@
   },
   "dependencies": {
     "@astrojs/node": "^8.2.5",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "html-minifier": "^4.0.0"
   },
   "devDependencies": {
diff --git a/examples/minimal/package.json b/examples/minimal/package.json
index a0b8dfcb1cdf..840a5ac7c6dd 100644
--- a/examples/minimal/package.json
+++ b/examples/minimal/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json
index 3b7608d70e1a..260c84d09f61 100644
--- a/examples/non-html-pages/package.json
+++ b/examples/non-html-pages/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json
index 9eb3b2b97e7d..caec4c105fa0 100644
--- a/examples/portfolio/package.json
+++ b/examples/portfolio/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/ssr/package.json b/examples/ssr/package.json
index 667ed53e12b2..45210122da37 100644
--- a/examples/ssr/package.json
+++ b/examples/ssr/package.json
@@ -14,7 +14,7 @@
   "dependencies": {
     "@astrojs/node": "^8.2.5",
     "@astrojs/svelte": "^5.4.0",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "svelte": "^4.2.5"
   }
 }
diff --git a/examples/starlog/package.json b/examples/starlog/package.json
index e9efca280ec8..bc4e0e23a21b 100644
--- a/examples/starlog/package.json
+++ b/examples/starlog/package.json
@@ -10,7 +10,7 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "sass": "^1.69.5",
     "sharp": "^0.32.6"
   }
diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json
index 26fe5823ca45..512a2bcc80c4 100644
--- a/examples/view-transitions/package.json
+++ b/examples/view-transitions/package.json
@@ -12,6 +12,6 @@
   "devDependencies": {
     "@astrojs/tailwind": "^5.1.0",
     "@astrojs/node": "^8.2.5",
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json
index 193589627c44..f799e483f45c 100644
--- a/examples/with-markdoc/package.json
+++ b/examples/with-markdoc/package.json
@@ -12,6 +12,6 @@
   },
   "dependencies": {
     "@astrojs/markdoc": "^0.10.0",
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json
index 449c58d70937..84b5ca0dcfae 100644
--- a/examples/with-markdown-plugins/package.json
+++ b/examples/with-markdown-plugins/package.json
@@ -12,7 +12,7 @@
   },
   "dependencies": {
     "@astrojs/markdown-remark": "^5.1.0",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "hast-util-select": "^6.0.2",
     "rehype-autolink-headings": "^7.1.0",
     "rehype-slug": "^6.0.0",
diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json
index 493ec1a85271..580dd76819f3 100644
--- a/examples/with-markdown-shiki/package.json
+++ b/examples/with-markdown-shiki/package.json
@@ -11,6 +11,6 @@
     "astro": "astro"
   },
   "dependencies": {
-    "astro": "^4.6.0"
+    "astro": "^4.6.1"
   }
 }
diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json
index c996b84223db..c1b05389ace3 100644
--- a/examples/with-mdx/package.json
+++ b/examples/with-mdx/package.json
@@ -13,7 +13,7 @@
   "dependencies": {
     "@astrojs/mdx": "^2.3.0",
     "@astrojs/preact": "^3.2.0",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "preact": "^10.19.2"
   }
 }
diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json
index 7fe2f1dabcef..122a12cfc7f9 100644
--- a/examples/with-nanostores/package.json
+++ b/examples/with-nanostores/package.json
@@ -13,7 +13,7 @@
   "dependencies": {
     "@astrojs/preact": "^3.2.0",
     "@nanostores/preact": "^0.5.0",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "nanostores": "^0.9.5",
     "preact": "^10.19.2"
   }
diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json
index 20020732a554..a6ff3928869e 100644
--- a/examples/with-tailwindcss/package.json
+++ b/examples/with-tailwindcss/package.json
@@ -14,7 +14,7 @@
     "@astrojs/mdx": "^2.3.0",
     "@astrojs/tailwind": "^5.1.0",
     "@types/canvas-confetti": "^1.6.3",
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "autoprefixer": "^10.4.15",
     "canvas-confetti": "^1.9.1",
     "postcss": "^8.4.28",
diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json
index b408fa7190b0..9f98c60e0e42 100644
--- a/examples/with-vitest/package.json
+++ b/examples/with-vitest/package.json
@@ -12,7 +12,7 @@
     "test": "vitest"
   },
   "dependencies": {
-    "astro": "^4.6.0",
+    "astro": "^4.6.1",
     "vitest": "^1.3.1"
   }
 }
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index d38f80b01bce..5161ed864e28 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,13 @@
 # astro
 
+## 4.6.1
+
+### Patch Changes
+
+- [#10708](https://github.com/withastro/astro/pull/10708) [`742866c5669a2be4f8b5a4c861cadb933c381415`](https://github.com/withastro/astro/commit/742866c5669a2be4f8b5a4c861cadb933c381415) Thanks [@horo-fox](https://github.com/horo-fox)! - Limits parallel imports within `getCollection()` to prevent EMFILE errors when accessing files
+
+- [#10755](https://github.com/withastro/astro/pull/10755) [`c6d59b6fb7db20af957a8706c8159c50619235ef`](https://github.com/withastro/astro/commit/c6d59b6fb7db20af957a8706c8159c50619235ef) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a case where the i18n fallback failed to correctly redirect to the index page with SSR enabled
+
 ## 4.6.0
 
 ### Minor Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 1f3463d8d181..bdc85a699053 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
 {
   "name": "astro",
-  "version": "4.6.0",
+  "version": "4.6.1",
   "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.",
   "type": "module",
   "author": "withastro",
diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md
index 5c462e3c5084..e7087ef74c5b 100644
--- a/packages/db/CHANGELOG.md
+++ b/packages/db/CHANGELOG.md
@@ -1,5 +1,11 @@
 # @astrojs/db
 
+## 0.10.4
+
+### Patch Changes
+
+- [#10764](https://github.com/withastro/astro/pull/10764) [`d1080ea81de0db1d1aed97a65c490766c17ab312`](https://github.com/withastro/astro/commit/d1080ea81de0db1d1aed97a65c490766c17ab312) Thanks [@delucis](https://github.com/delucis)! - Improves `package.json` metadata fields
+
 ## 0.10.3
 
 ### Patch Changes
diff --git a/packages/db/package.json b/packages/db/package.json
index 68149f69bbd9..d4e56e19bf95 100644
--- a/packages/db/package.json
+++ b/packages/db/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@astrojs/db",
-  "version": "0.10.3",
+  "version": "0.10.4",
   "description": "Add libSQL and Astro Studio support to your Astro site",
   "license": "MIT",
   "repository": {
diff --git a/packages/integrations/vercel/CHANGELOG.md b/packages/integrations/vercel/CHANGELOG.md
index 1a1b7e053781..9b7d2ff51c82 100644
--- a/packages/integrations/vercel/CHANGELOG.md
+++ b/packages/integrations/vercel/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @astrojs/vercel
 
+## 7.5.3
+
+### Patch Changes
+
+- [#10756](https://github.com/withastro/astro/pull/10756) [`c75ededdb401cfa55e1ad2682d5e95494f49604e`](https://github.com/withastro/astro/commit/c75ededdb401cfa55e1ad2682d5e95494f49604e) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Fixes `widths` and `densities` not working when using Vercel's Image Optimization.
+
+  Note that you still need to make sure that the widths you're outputting are enabled in [the `imageConfig` property of the Vercel adapter](https://docs.astro.build/en/guides/integrations-guide/vercel/#imagesconfig) in order for these properties to work.
+
 ## 7.5.2
 
 ### Patch Changes
diff --git a/packages/integrations/vercel/package.json b/packages/integrations/vercel/package.json
index 207668a94c13..1702249184c9 100644
--- a/packages/integrations/vercel/package.json
+++ b/packages/integrations/vercel/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@astrojs/vercel",
   "description": "Deploy your site to Vercel",
-  "version": "7.5.2",
+  "version": "7.5.3",
   "type": "module",
   "author": "withastro",
   "license": "MIT",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 952e1aa2f05d..47a25b062215 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -134,7 +134,7 @@ importers:
   examples/basics:
     dependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/blog:
@@ -149,13 +149,13 @@ importers:
         specifier: ^3.1.2
         version: link:../../packages/integrations/sitemap
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/component:
     devDependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/framework-alpine:
@@ -170,7 +170,7 @@ importers:
         specifier: ^3.13.3
         version: 3.13.8
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/framework-lit:
@@ -182,7 +182,7 @@ importers:
         specifier: ^0.2.1
         version: 0.2.1
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       lit:
         specifier: ^3.1.2
@@ -212,7 +212,7 @@ importers:
         specifier: ^18.2.15
         version: 18.2.24
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
@@ -242,7 +242,7 @@ importers:
         specifier: ^1.2.1
         version: 1.2.1(preact@10.20.1)
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
@@ -260,7 +260,7 @@ importers:
         specifier: ^18.2.15
         version: 18.2.24
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       react:
         specifier: ^18.2.0
@@ -275,7 +275,7 @@ importers:
         specifier: ^4.1.0
         version: link:../../packages/integrations/solid
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       solid-js:
         specifier: ^1.8.5
@@ -287,7 +287,7 @@ importers:
         specifier: ^5.4.0
         version: link:../../packages/integrations/svelte
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       svelte:
         specifier: ^4.2.5
@@ -299,7 +299,7 @@ importers:
         specifier: ^4.1.0
         version: link:../../packages/integrations/vue
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       vue:
         specifier: ^3.3.8
@@ -311,13 +311,13 @@ importers:
         specifier: ^8.2.5
         version: link:../../packages/integrations/node
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/integration:
     devDependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/middleware:
@@ -326,7 +326,7 @@ importers:
         specifier: ^8.2.5
         version: link:../../packages/integrations/node
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       html-minifier:
         specifier: ^4.0.0
@@ -339,19 +339,19 @@ importers:
   examples/minimal:
     dependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/non-html-pages:
     dependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/portfolio:
     dependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/ssr:
@@ -363,7 +363,7 @@ importers:
         specifier: ^5.4.0
         version: link:../../packages/integrations/svelte
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       svelte:
         specifier: ^4.2.5
@@ -372,7 +372,7 @@ importers:
   examples/starlog:
     dependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       sass:
         specifier: ^1.69.5
@@ -390,7 +390,7 @@ importers:
         specifier: ^5.1.0
         version: link:../../packages/integrations/tailwind
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/with-markdoc:
@@ -399,7 +399,7 @@ importers:
         specifier: ^0.10.0
         version: link:../../packages/integrations/markdoc
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/with-markdown-plugins:
@@ -408,7 +408,7 @@ importers:
         specifier: ^5.1.0
         version: link:../../packages/markdown/remark
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       hast-util-select:
         specifier: ^6.0.2
@@ -429,7 +429,7 @@ importers:
   examples/with-markdown-shiki:
     dependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
 
   examples/with-mdx:
@@ -441,7 +441,7 @@ importers:
         specifier: ^3.2.0
         version: link:../../packages/integrations/preact
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
@@ -456,7 +456,7 @@ importers:
         specifier: ^0.5.0
         version: 0.5.1(nanostores@0.9.5)(preact@10.20.1)
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       nanostores:
         specifier: ^0.9.5
@@ -477,7 +477,7 @@ importers:
         specifier: ^1.6.3
         version: 1.6.4
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       autoprefixer:
         specifier: ^10.4.15
@@ -495,7 +495,7 @@ importers:
   examples/with-vitest:
     dependencies:
       astro:
-        specifier: ^4.6.0
+        specifier: ^4.6.1
         version: link:../../packages/astro
       vitest:
         specifier: ^1.3.1

From 808c9946dece18452951f0253a61c3848fa17824 Mon Sep 17 00:00:00 2001
From: Erika <3019731+Princesseuh@users.noreply.github.com>
Date: Fri, 12 Apr 2024 13:56:54 -0400
Subject: [PATCH 62/96] fix(add): Fixes astro add modifying baseUrl by accident
 (#10774)

* fix(add): Fixes `astro add` modifying `baseUrl` by accident

* chore: changeset

* test: add test

* fix: tsconfig not being a json maybe is a mistake, I don't know!

* test: fix

* Update packages/astro/test/fixtures/tsconfig-handling/baseUrl/tsconfig.json

Co-authored-by: Nate Moore 

---------

Co-authored-by: Nate Moore 
---
 .changeset/mean-candles-hammer.md              |  5 +++++
 packages/astro/src/cli/add/index.ts            |  6 +++---
 packages/astro/src/core/config/tsconfig.ts     | 18 +++++++++++++++---
 .../tsconfig-handling/baseUrl/tsconfig.json    |  6 ++++++
 .../test/units/config/config-tsconfig.test.js  | 10 ++++++++++
 5 files changed, 39 insertions(+), 6 deletions(-)
 create mode 100644 .changeset/mean-candles-hammer.md
 create mode 100644 packages/astro/test/fixtures/tsconfig-handling/baseUrl/tsconfig.json

diff --git a/.changeset/mean-candles-hammer.md b/.changeset/mean-candles-hammer.md
new file mode 100644
index 000000000000..cb825a493a58
--- /dev/null
+++ b/.changeset/mean-candles-hammer.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes `astro add` sometimes modifying `baseUrl` unintentionally
diff --git a/packages/astro/src/cli/add/index.ts b/packages/astro/src/cli/add/index.ts
index d1c7eec2e9ca..2f8b73d560f1 100644
--- a/packages/astro/src/cli/add/index.ts
+++ b/packages/astro/src/cli/add/index.ts
@@ -968,16 +968,16 @@ async function updateTSConfig(
 		inputConfig = {
 			tsconfig: defaultTSConfig,
 			tsconfigFile: path.join(cwd, 'tsconfig.json'),
-			rawConfig: { tsconfig: defaultTSConfig, tsconfigFile: path.join(cwd, 'tsconfig.json') },
+			rawConfig: defaultTSConfig,
 		};
 	} else {
-		inputConfigText = JSON.stringify(inputConfig.rawConfig.tsconfig, null, 2);
+		inputConfigText = JSON.stringify(inputConfig.rawConfig, null, 2);
 	}
 
 	const configFileName = path.basename(inputConfig.tsconfigFile);
 
 	const outputConfig = updateTSConfigForFramework(
-		inputConfig.rawConfig.tsconfig,
+		inputConfig.rawConfig,
 		firstIntegrationWithTSSettings
 	);
 
diff --git a/packages/astro/src/core/config/tsconfig.ts b/packages/astro/src/core/config/tsconfig.ts
index f0e747877842..f0236309e492 100644
--- a/packages/astro/src/core/config/tsconfig.ts
+++ b/packages/astro/src/core/config/tsconfig.ts
@@ -1,10 +1,12 @@
 import { join } from 'node:path';
+import { readFile } from "node:fs/promises"
 import {
 	TSConfckParseError,
 	type TSConfckParseOptions,
 	type TSConfckParseResult,
 	find,
 	parse,
+	toJson
 } from 'tsconfck';
 import type { CompilerOptions, TypeAcquisition } from 'typescript';
 
@@ -64,7 +66,7 @@ type TSConfigResult = Promise<
 export async function loadTSConfig(
 	root: string | undefined,
 	findUp = false
-): Promise> {
+): Promise> {
 	const safeCwd = root ?? process.cwd();
 
 	const [jsconfig, tsconfig] = await Promise.all(
@@ -85,7 +87,13 @@ export async function loadTSConfig(
 			return parsedConfig;
 		}
 
-		return { ...parsedConfig, rawConfig: parsedConfig.extended?.[0] ?? parsedConfig.tsconfig };
+		// tsconfck does not return the original config, so we need to parse it ourselves
+		// https://github.com/dominikg/tsconfck/issues/138
+		const rawConfig = await readFile(tsconfig, 'utf-8')
+			.then(toJson)
+			.then((content) => JSON.parse(content) as TSConfig);
+
+		return { ...parsedConfig, rawConfig };
 	}
 
 	if (jsconfig) {
@@ -95,7 +103,11 @@ export async function loadTSConfig(
 			return parsedConfig;
 		}
 
-		return { ...parsedConfig, rawConfig: parsedConfig.extended?.[0] ?? parsedConfig.tsconfig };
+		const rawConfig = await readFile(jsconfig, 'utf-8')
+			.then(toJson)
+			.then((content) => JSON.parse(content) as TSConfig);
+
+		return { ...parsedConfig, rawConfig: rawConfig };
 	}
 
 	return 'missing-config';
diff --git a/packages/astro/test/fixtures/tsconfig-handling/baseUrl/tsconfig.json b/packages/astro/test/fixtures/tsconfig-handling/baseUrl/tsconfig.json
new file mode 100644
index 000000000000..bd5b17453a2c
--- /dev/null
+++ b/packages/astro/test/fixtures/tsconfig-handling/baseUrl/tsconfig.json
@@ -0,0 +1,6 @@
+{
+  "files": ["i-have-base-url"],
+  "compilerOptions": {
+    "baseUrl": ".",
+  }
+}
diff --git a/packages/astro/test/units/config/config-tsconfig.test.js b/packages/astro/test/units/config/config-tsconfig.test.js
index c6372cbe0766..f83e9bcc3036 100644
--- a/packages/astro/test/units/config/config-tsconfig.test.js
+++ b/packages/astro/test/units/config/config-tsconfig.test.js
@@ -3,6 +3,8 @@ import * as path from 'node:path';
 import { describe, it } from 'node:test';
 import { fileURLToPath } from 'node:url';
 import { loadTSConfig, updateTSConfigForFramework } from '../../../dist/core/config/index.js';
+import { readFile } from 'node:fs/promises';
+import { toJson } from 'tsconfck';
 
 const cwd = fileURLToPath(new URL('../../fixtures/tsconfig-handling/', import.meta.url));
 
@@ -37,6 +39,14 @@ describe('TSConfig handling', () => {
 			assert.equal(invalidConfig, 'invalid-config');
 			assert.equal(missingConfig, 'missing-config');
 		});
+
+		it('does not change baseUrl in raw config', async () => {
+			const loadedConfig = await loadTSConfig(path.join(cwd, 'baseUrl'));
+			const rawConfig = await readFile(path.join(cwd, 'baseUrl', 'tsconfig.json'), 'utf-8').then(toJson)
+			.then((content) => JSON.parse(content));
+
+			assert.deepEqual(loadedConfig.rawConfig, rawConfig);
+		});
 	});
 
 	describe('tsconfig / jsconfig updates', () => {

From be8307b714bc2e2e43f6e5e851c5f4a62e1d182a Mon Sep 17 00:00:00 2001
From: Erika 
Date: Fri, 12 Apr 2024 17:58:00 +0000
Subject: [PATCH 63/96] [ci] format

---
 packages/astro/src/core/config/tsconfig.ts               | 4 ++--
 packages/astro/test/units/config/config-tsconfig.test.js | 9 +++++----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/packages/astro/src/core/config/tsconfig.ts b/packages/astro/src/core/config/tsconfig.ts
index f0236309e492..25c9b01ba4c8 100644
--- a/packages/astro/src/core/config/tsconfig.ts
+++ b/packages/astro/src/core/config/tsconfig.ts
@@ -1,12 +1,12 @@
+import { readFile } from 'node:fs/promises';
 import { join } from 'node:path';
-import { readFile } from "node:fs/promises"
 import {
 	TSConfckParseError,
 	type TSConfckParseOptions,
 	type TSConfckParseResult,
 	find,
 	parse,
-	toJson
+	toJson,
 } from 'tsconfck';
 import type { CompilerOptions, TypeAcquisition } from 'typescript';
 
diff --git a/packages/astro/test/units/config/config-tsconfig.test.js b/packages/astro/test/units/config/config-tsconfig.test.js
index f83e9bcc3036..a82ef8b25d7f 100644
--- a/packages/astro/test/units/config/config-tsconfig.test.js
+++ b/packages/astro/test/units/config/config-tsconfig.test.js
@@ -1,10 +1,10 @@
 import * as assert from 'node:assert/strict';
+import { readFile } from 'node:fs/promises';
 import * as path from 'node:path';
 import { describe, it } from 'node:test';
 import { fileURLToPath } from 'node:url';
-import { loadTSConfig, updateTSConfigForFramework } from '../../../dist/core/config/index.js';
-import { readFile } from 'node:fs/promises';
 import { toJson } from 'tsconfck';
+import { loadTSConfig, updateTSConfigForFramework } from '../../../dist/core/config/index.js';
 
 const cwd = fileURLToPath(new URL('../../fixtures/tsconfig-handling/', import.meta.url));
 
@@ -42,8 +42,9 @@ describe('TSConfig handling', () => {
 
 		it('does not change baseUrl in raw config', async () => {
 			const loadedConfig = await loadTSConfig(path.join(cwd, 'baseUrl'));
-			const rawConfig = await readFile(path.join(cwd, 'baseUrl', 'tsconfig.json'), 'utf-8').then(toJson)
-			.then((content) => JSON.parse(content));
+			const rawConfig = await readFile(path.join(cwd, 'baseUrl', 'tsconfig.json'), 'utf-8')
+				.then(toJson)
+				.then((content) => JSON.parse(content));
 
 			assert.deepEqual(loadedConfig.rawConfig, rawConfig);
 		});

From 85f2e57fdfb4a25aa938b70e00553dce1020a073 Mon Sep 17 00:00:00 2001
From: Bjorn Lu 
Date: Mon, 15 Apr 2024 15:56:53 +0800
Subject: [PATCH 64/96] Remove MDX processor on buildEnd (#10770)

---
 .changeset/orange-ladybugs-nail.md            |  5 ++++
 benchmark/make-project/memory-default.js      | 23 +++++++++++++++++++
 .../astro/src/vite-plugin-markdown/index.ts   | 10 +++++++-
 packages/integrations/mdx/src/index.ts        | 13 ++++++++++-
 packages/markdown/remark/src/highlight.ts     |  1 +
 5 files changed, 50 insertions(+), 2 deletions(-)
 create mode 100644 .changeset/orange-ladybugs-nail.md

diff --git a/.changeset/orange-ladybugs-nail.md b/.changeset/orange-ladybugs-nail.md
new file mode 100644
index 000000000000..b1b1f25b7505
--- /dev/null
+++ b/.changeset/orange-ladybugs-nail.md
@@ -0,0 +1,5 @@
+---
+"@astrojs/mdx": patch
+---
+
+Removes internal MDX processor on `buildEnd` to free up memory
diff --git a/benchmark/make-project/memory-default.js b/benchmark/make-project/memory-default.js
index 647233e7ce81..e3652dd5794b 100644
--- a/benchmark/make-project/memory-default.js
+++ b/benchmark/make-project/memory-default.js
@@ -35,6 +35,17 @@ ${loremIpsum}
 		);
 	}
 
+	for (let i = 0; i < 100; i++) {
+		const content = `\
+# Post ${i}
+
+${loremIpsum}
+`;
+		promises.push(
+			fs.writeFile(new URL(`./src/content/blog/post-${i}.mdx`, projectDir), content, 'utf-8')
+		);
+	}
+
 	await fs.writeFile(
 		new URL(`./src/pages/blog/[...slug].astro`, projectDir),
 		`\
@@ -56,4 +67,16 @@ const { Content } = await entry.render();
 	);
 
 	await Promise.all(promises);
+
+	await fs.writeFile(
+		new URL('./astro.config.js', projectDir),
+		`\
+import { defineConfig } from 'astro/config';
+import mdx from '@astrojs/mdx';
+
+export default defineConfig({
+  integrations: [mdx()],
+});`,
+		'utf-8'
+	);
 }
diff --git a/packages/astro/src/vite-plugin-markdown/index.ts b/packages/astro/src/vite-plugin-markdown/index.ts
index a1b3887ff6a9..a77a6ede2697 100644
--- a/packages/astro/src/vite-plugin-markdown/index.ts
+++ b/packages/astro/src/vite-plugin-markdown/index.ts
@@ -55,7 +55,15 @@ export default function markdown({ settings, logger }: AstroPluginOptions): Plug
 
 				const fileURL = pathToFileURL(fileId);
 
-				const renderResult = await processor!
+				// `processor` is initialized in `buildStart`, and removed in `buildEnd`. `load`
+				// should be called in between those two lifecycles, so this error should never happen
+				if (!processor) {
+					return this.error(
+						'MDX processor is not initialized. This is an internal error. Please file an issue.'
+					);
+				}
+
+				const renderResult = await processor
 					.render(raw.content, {
 						// @ts-expect-error passing internal prop
 						fileURL,
diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts
index 964b66eabafd..bdf1c90627f2 100644
--- a/packages/integrations/mdx/src/index.ts
+++ b/packages/integrations/mdx/src/index.ts
@@ -75,7 +75,7 @@ export default function mdx(partialMdxOptions: Partial = {}): AstroI
 					),
 				});
 
-				let processor: ReturnType;
+				let processor: ReturnType | undefined;
 
 				updateConfig({
 					vite: {
@@ -83,6 +83,9 @@ export default function mdx(partialMdxOptions: Partial = {}): AstroI
 							{
 								name: '@mdx-js/rollup',
 								enforce: 'pre',
+								buildEnd() {
+									processor = undefined;
+								},
 								configResolved(resolved) {
 									processor = createMdxProcessor(mdxOptions, {
 										sourcemap: !!resolved.build.sourcemap,
@@ -118,6 +121,14 @@ export default function mdx(partialMdxOptions: Partial = {}): AstroI
 									// Ensure `data.astro` is available to all remark plugins
 									setVfileFrontmatter(vfile, frontmatter);
 
+									// `processor` is initialized in `configResolved`, and removed in `buildEnd`. `transform`
+									// should be called in between those two lifecycle, so this error should never happen
+									if (!processor) {
+										return this.error(
+											'MDX processor is not initialized. This is an internal error. Please file an issue.'
+										);
+									}
+
 									try {
 										const compiled = await processor.process(vfile);
 
diff --git a/packages/markdown/remark/src/highlight.ts b/packages/markdown/remark/src/highlight.ts
index 8bc7c492d12d..3338f75b792a 100644
--- a/packages/markdown/remark/src/highlight.ts
+++ b/packages/markdown/remark/src/highlight.ts
@@ -73,6 +73,7 @@ export async function highlightCodeBlocks(tree: Root, highlighter: Highlighter)
 	for (const { node, language, grandParent, parent } of nodes) {
 		const meta = (node.data as any)?.meta ?? node.properties.metastring ?? undefined;
 		const code = toText(node, { whitespace: 'pre' });
+		// TODO: In Astro 5, have `highlighter()` return hast directly to skip expensive HTML parsing and serialization.
 		const html = await highlighter(code, language, { meta });
 		// The replacement returns a root node with 1 child, the `` element replacement.
 		const replacement = fromHtml(html, { fragment: true }).children[0] as Element;

From 2f56413042b6f4081dd30f1ecf50e527887b3d73 Mon Sep 17 00:00:00 2001
From: Jason 
Date: Mon, 15 Apr 2024 16:05:10 +0800
Subject: [PATCH 65/96] lint: upgrade eslint to version 9 (#10730)

---
 .eslintignore                                 |   9 -
 .eslintrc.cjs                                 | 158 ----------
 eslint.config.js                              | 206 +++++++++++++
 package.json                                  |  10 +-
 .../utils/vendor/image-size/types/svg.ts      |   1 -
 packages/astro/src/core/build/generate.ts     |   2 +-
 .../src/runtime/server/render/component.ts    |   1 +
 packages/db/src/runtime/errors.ts             |   2 +-
 pnpm-lock.yaml                                | 276 +++++++++---------
 9 files changed, 351 insertions(+), 314 deletions(-)
 delete mode 100644 .eslintignore
 delete mode 100644 .eslintrc.cjs
 create mode 100644 eslint.config.js

diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 2b3b5903586c..000000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,9 +0,0 @@
-**/*.d.ts
-packages/**/*.min.js
-packages/**/dist/**/*
-packages/**/fixtures/**/*
-packages/astro/vendor/vite/**/*
-examples/**/*
-scripts/**/*
-.github
-.changeset
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index 78cf3eb9a67f..000000000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,158 +0,0 @@
-// eslint-disable-next-line @typescript-eslint/no-var-requires
-const { builtinModules } = require('module');
-
-/** @type {import("@types/eslint").Linter.Config} */
-module.exports = {
-  extends: [
-    'plugin:@typescript-eslint/recommended-type-checked',
-    'plugin:@typescript-eslint/stylistic-type-checked',
-    'prettier',
-    'plugin:regexp/recommended',
-  ],
-  parser: '@typescript-eslint/parser',
-  parserOptions: {
-    project: ['./packages/*/tsconfig.json', './tsconfig.eslint.json'],
-    tsconfigRootDir: __dirname,
-  },
-  plugins: ['@typescript-eslint', 'prettier', 'no-only-tests', 'regexp'],
-  rules: {
-    // These off/configured-differently-by-default rules fit well for us
-    '@typescript-eslint/switch-exhaustiveness-check': 'error',
-    '@typescript-eslint/array-type': ['error', { default: 'array-simple' }],
-    '@typescript-eslint/no-unused-vars': [
-      'warn',
-      {
-        argsIgnorePattern: '^_',
-        varsIgnorePattern: '^_',
-        caughtErrorsIgnorePattern: '^_',
-        ignoreRestSiblings: true,
-      },
-    ],
-    'no-only-tests/no-only-tests': 'error',
-    '@typescript-eslint/no-shadow': ['error'],
-    'no-console': 'warn',
-
-    // Todo: do we want these?
-    '@typescript-eslint/array-type': 'off',
-    '@typescript-eslint/ban-ts-comment': 'off',
-    '@typescript-eslint/class-literal-property-style': 'off',
-    '@typescript-eslint/consistent-indexed-object-style': 'off',
-    '@typescript-eslint/consistent-type-definitions': 'off',
-    '@typescript-eslint/dot-notation': 'off',
-    '@typescript-eslint/no-base-to-string': 'off',
-    '@typescript-eslint/no-empty-function': 'off',
-    '@typescript-eslint/no-floating-promises': 'off',
-    '@typescript-eslint/no-misused-promises': 'off',
-    '@typescript-eslint/no-redundant-type-constituents': 'off',
-    '@typescript-eslint/no-this-alias': 'off',
-    '@typescript-eslint/no-unsafe-argument': 'off',
-    '@typescript-eslint/no-unsafe-assignment': 'off',
-    '@typescript-eslint/no-unsafe-call': 'off',
-    '@typescript-eslint/no-unsafe-member-access': 'off',
-    '@typescript-eslint/no-unsafe-return': 'off',
-    '@typescript-eslint/prefer-nullish-coalescing': 'off',
-    '@typescript-eslint/prefer-optional-chain': 'off',
-    '@typescript-eslint/prefer-string-starts-ends-with': 'off',
-    '@typescript-eslint/require-await': 'off',
-    '@typescript-eslint/restrict-plus-operands': 'off',
-    '@typescript-eslint/restrict-template-expressions': 'off',
-    '@typescript-eslint/sort-type-constituents': 'off',
-    '@typescript-eslint/unbound-method': 'off',
-    '@typescript-eslint/no-explicit-any': 'off',
-
-    // Enforce separate type imports for type-only imports to avoid bundling unneeded code
-    '@typescript-eslint/consistent-type-imports': [
-      'error',
-      {
-        prefer: 'type-imports',
-        fixStyle: 'separate-type-imports',
-        disallowTypeAnnotations: false,
-      },
-    ],
-
-    // These rules enabled by the preset configs don't work well for us
-    '@typescript-eslint/await-thenable': 'off',
-    'prefer-const': 'off',
-
-    // In some cases, using explicit letter-casing is more performant than the `i` flag
-    'regexp/use-ignore-case': 'off',
-  },
-  overrides: [
-    {
-      // Ensure Node builtins aren't included in Astro's server runtime
-      files: ['packages/astro/src/runtime/**/*.ts'],
-      rules: {
-        'no-restricted-imports': [
-          'error',
-          {
-            paths: [...builtinModules],
-            patterns: ['node:*'],
-          },
-        ],
-      },
-    },
-    {
-      files: ['packages/astro/src/runtime/client/**/*.ts'],
-      env: {
-        browser: true,
-      },
-    },
-    {
-      files: ['packages/**/test/*.js', 'packages/**/*.js'],
-      env: {
-        mocha: true,
-      },
-      globals: {
-        globalThis: false, // false means read-only
-      },
-      rules: {
-        'no-console': 'off',
-      },
-    },
-    {
-      files: ['packages/integrations/**/*.ts'],
-      rules: {
-        'no-console': ['error', { allow: ['warn', 'error', 'info', 'debug'] }],
-      },
-    },
-    {
-      files: ['benchmark/**/*.js'],
-      rules: {
-        '@typescript-eslint/no-unused-vars': 'off',
-        'no-console': 'off',
-      },
-    },
-    {
-      files: ['packages/db/**/cli/**/*.ts'],
-      rules: {
-        'no-console': 'off',
-      },
-    },
-    {
-      files: ['packages/astro/src/core/errors/errors-data.ts'],
-      rules: {
-        // This file is used for docs generation, as such the code need to be in a certain format, we can somewhat ensure this with these rules
-        'object-shorthand': ['error', 'methods', { avoidExplicitReturnArrows: true }],
-        'arrow-body-style': ['error', 'never'],
-      },
-    },
-
-    {
-      files: ['packages/db/src/runtime/**/*.ts'],
-      rules: {
-        'no-restricted-imports': 'off',
-        '@typescript-eslint/no-restricted-imports': [
-          'error',
-          {
-            patterns: [
-              {
-                group: ['../core/*'],
-                allowTypeImports: true,
-              },
-            ],
-          },
-        ],
-      },
-    },
-  ],
-};
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 000000000000..230d06a2162a
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,206 @@
+import path from 'node:path';
+import {fileURLToPath} from 'node:url';
+import {builtinModules} from "node:module";
+
+import {FlatCompat} from "@eslint/eslintrc";
+import tseslint from 'typescript-eslint';
+
+// plugins
+import prettierEslint from 'eslint-plugin-prettier';
+import noOnlyTestsEslint from 'eslint-plugin-no-only-tests';
+import regexpEslint from 'eslint-plugin-regexp'
+const typescriptEslint = tseslint.plugin;
+
+// parsers
+const typescriptParser = tseslint.parser;
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+// ref: https://eslint.org/docs/latest/use/configure/migration-guide#using-eslintrc-configs-in-flat-config
+// mimic CommonJS variables -- not needed if using CommonJS
+const compat = new FlatCompat({
+	baseDirectory: __dirname
+});
+
+export default [
+	// If ignores is used without any other keys in the configuration object, then the patterns act as global ignores.
+	// ref: https://eslint.org/docs/latest/use/configure/configuration-files#globally-ignoring-files-with-ignores
+	{
+		ignores: [
+			"**/.*",
+			"**/*.d.ts",
+			"packages/**/*.min.js",
+			"packages/**/dist/",
+			"packages/**/fixtures/",
+			"packages/astro/vendor/vite/",
+			"benchmark/**/dist/",
+			"examples/",
+			"scripts/",
+			".github/",
+			".changeset/",
+		]
+	},
+
+	...tseslint.configs.recommendedTypeChecked,
+	...tseslint.configs.stylisticTypeChecked,
+	// mimic ESLintRC-style extends
+	...compat.extends('prettier'),
+	...compat.extends('plugin:regexp/recommended'),
+	{
+		languageOptions: {
+			parser: typescriptParser,
+			parserOptions: {
+				project: ['./packages/*/tsconfig.json', './tsconfig.eslint.json'],
+				tsconfigRootDir: __dirname,
+			},
+		},
+		plugins: {
+			"@typescript-eslint": typescriptEslint,
+			"prettier": prettierEslint,
+			"no-only-tests": noOnlyTestsEslint,
+			"regexp": regexpEslint,
+		},
+		rules: {
+			// These off/configured-differently-by-default rules fit well for us
+			'@typescript-eslint/switch-exhaustiveness-check': 'error',
+			'@typescript-eslint/no-unused-vars': [
+				'warn',
+				{
+					argsIgnorePattern: '^_',
+					varsIgnorePattern: '^_',
+					caughtErrorsIgnorePattern: '^_',
+					ignoreRestSiblings: true,
+				},
+			],
+			'no-only-tests/no-only-tests': 'error',
+			'@typescript-eslint/no-shadow': 'error',
+			'no-console': 'warn',
+
+			// Todo: do we want these?
+			'@typescript-eslint/array-type': 'off',
+			'@typescript-eslint/ban-ts-comment': 'off',
+			'@typescript-eslint/class-literal-property-style': 'off',
+			'@typescript-eslint/consistent-indexed-object-style': 'off',
+			'@typescript-eslint/consistent-type-definitions': 'off',
+			'@typescript-eslint/dot-notation': 'off',
+			'@typescript-eslint/no-base-to-string': 'off',
+			'@typescript-eslint/no-empty-function': 'off',
+			'@typescript-eslint/no-floating-promises': 'off',
+			'@typescript-eslint/no-misused-promises': 'off',
+			'@typescript-eslint/no-redundant-type-constituents': 'off',
+			'@typescript-eslint/no-this-alias': 'off',
+			'@typescript-eslint/no-unsafe-argument': 'off',
+			'@typescript-eslint/no-unsafe-assignment': 'off',
+			'@typescript-eslint/no-unsafe-call': 'off',
+			'@typescript-eslint/no-unsafe-member-access': 'off',
+			'@typescript-eslint/no-unsafe-return': 'off',
+			'@typescript-eslint/no-unnecessary-type-assertion': 'off',
+			'@typescript-eslint/prefer-nullish-coalescing': 'off',
+			'@typescript-eslint/prefer-optional-chain': 'off',
+			'@typescript-eslint/prefer-string-starts-ends-with': 'off',
+			'@typescript-eslint/require-await': 'off',
+			'@typescript-eslint/restrict-plus-operands': 'off',
+			'@typescript-eslint/restrict-template-expressions': 'off',
+			'@typescript-eslint/sort-type-constituents': 'off',
+			'@typescript-eslint/unbound-method': 'off',
+			'@typescript-eslint/no-explicit-any': 'off',
+
+			// Enforce separate type imports for type-only imports to avoid bundling unneeded code
+			'@typescript-eslint/consistent-type-imports': [
+				'error',
+				{
+					prefer: 'type-imports',
+					fixStyle: 'separate-type-imports',
+					disallowTypeAnnotations: false,
+				},
+			],
+
+			// These rules enabled by the preset configs don't work well for us
+			'@typescript-eslint/await-thenable': 'off',
+			'prefer-const': 'off',
+
+			// In some cases, using explicit letter-casing is more performant than the `i` flag
+			'regexp/use-ignore-case': 'off',
+		},
+	},
+
+	{
+		// Ensure Node builtins aren't included in Astro's server runtime
+		files: ['packages/astro/src/runtime/**/*.ts'],
+		rules: {
+			'no-restricted-imports': [
+				'error',
+				{
+					paths: [...builtinModules],
+					patterns: ['node:*'],
+				},
+			],
+		},
+	},
+	{
+		files: ['packages/astro/src/runtime/client/**/*.ts'],
+		languageOptions: {
+			globals: {
+				browser: true,
+			}
+		},
+	},
+	{
+		files: ['packages/**/test/*.js', 'packages/**/*.js'],
+		languageOptions: {
+			globals: {
+				mocha: true,
+				globalThis: false, // false means read-only
+			}
+		},
+		rules: {
+			'no-console': 'off',
+		},
+	},
+	{
+		files: ['packages/integrations/**/*.ts'],
+		rules: {
+			'no-console': ['error', {allow: ['warn', 'error', 'info', 'debug']}],
+		},
+	},
+	{
+		files: ['benchmark/**/*.js'],
+		rules: {
+			'@typescript-eslint/no-unused-vars': 'off',
+			'no-console': 'off',
+		},
+	},
+	{
+		files: ['packages/db/**/cli/**/*.ts'],
+		rules: {
+			'no-console': 'off',
+		},
+	},
+	{
+		files: ['packages/astro/src/core/errors/errors-data.ts'],
+		rules: {
+			// This file is used for docs generation, as such the code need to be in a certain format, we can somewhat ensure this with these rules
+			'object-shorthand': ['error', 'methods', {avoidExplicitReturnArrows: true}],
+			'arrow-body-style': ['error', 'never'],
+		},
+	},
+
+	{
+		files: ['packages/db/src/runtime/**/*.ts'],
+		rules: {
+			'no-restricted-imports': 'off',
+			'@typescript-eslint/no-restricted-imports': [
+				'error',
+				{
+					patterns: [
+						{
+							group: ['../core/*'],
+							allowTypeImports: true,
+						},
+					],
+				},
+			],
+		},
+	},
+]
diff --git a/package.json b/package.json
index 009cf5445426..2a2eadaa3fd8 100644
--- a/package.json
+++ b/package.json
@@ -52,15 +52,14 @@
     "astro-benchmark": "workspace:*"
   },
   "devDependencies": {
-    "@biomejs/biome": "1.5.3",
     "@astrojs/check": "^0.5.8",
+    "@biomejs/biome": "1.5.3",
     "@changesets/changelog-github": "^0.4.8",
     "@changesets/cli": "^2.26.2",
+    "@eslint/eslintrc": "^3.0.2",
     "@types/node": "^18.17.8",
-    "@typescript-eslint/eslint-plugin": "^6.11.0",
-    "@typescript-eslint/parser": "^6.11.0",
     "esbuild": "^0.19.6",
-    "eslint": "^8.54.0",
+    "eslint": "^9.0.0",
     "eslint-config-prettier": "^9.0.0",
     "eslint-plugin-no-only-tests": "^3.1.0",
     "eslint-plugin-prettier": "^5.0.0",
@@ -72,7 +71,8 @@
     "prettier-plugin-astro": "^0.12.2",
     "tiny-glob": "^0.2.9",
     "turbo": "^1.12.4",
-    "typescript": "~5.2.2"
+    "typescript": "~5.2.2",
+    "typescript-eslint": "^7.6.0"
   },
   "pnpm": {
     "packageExtensions": {
diff --git a/packages/astro/src/assets/utils/vendor/image-size/types/svg.ts b/packages/astro/src/assets/utils/vendor/image-size/types/svg.ts
index 8d8304e32311..11baaf6d2a85 100644
--- a/packages/astro/src/assets/utils/vendor/image-size/types/svg.ts
+++ b/packages/astro/src/assets/utils/vendor/image-size/types/svg.ts
@@ -56,7 +56,6 @@ function parseAttributes(root: string): IAttributes {
   const viewbox = root.match(extractorRegExps.viewbox)
   return {
     height: height && (parseLength(height[2]) as number),
-		// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
     viewbox: viewbox && (parseViewbox(viewbox[2]) as IAttributes),
     width: width && (parseLength(width[2]) as number),
   }
diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts
index a2c476572ab9..381c9e6426c8 100644
--- a/packages/astro/src/core/build/generate.ts
+++ b/packages/astro/src/core/build/generate.ts
@@ -1,7 +1,7 @@
 import fs from 'node:fs';
 import os from 'node:os';
 import { fileURLToPath } from 'node:url';
-import { bgGreen, black, blue, bold, dim, green, magenta, red } from 'kleur/colors';
+import { bgGreen, black, blue, bold, dim, green, magenta } from 'kleur/colors';
 import PQueue from 'p-queue';
 import type { OutputAsset, OutputChunk } from 'rollup';
 import type {
diff --git a/packages/astro/src/runtime/server/render/component.ts b/packages/astro/src/runtime/server/render/component.ts
index cff798e9024b..4473c7441f62 100644
--- a/packages/astro/src/runtime/server/render/component.ts
+++ b/packages/astro/src/runtime/server/render/component.ts
@@ -269,6 +269,7 @@ If you're still stuck, please open an issue on GitHub or join us at https://astr
 				: metadata.hydrateArgs;
 			if (!clientOnlyValues.has(rendererName)) {
 				// warning if provide incorrect client:only directive but find the renderer by guess
+				// eslint-disable-next-line no-console
 				console.warn(
 					`The client:only directive for ${metadata.displayName} is not recognized. The renderer ${renderer.name} will be used. If you intended to use a different renderer, please provide a valid client:only directive.`
 				);
diff --git a/packages/db/src/runtime/errors.ts b/packages/db/src/runtime/errors.ts
index 51febbff47b4..297cbc232399 100644
--- a/packages/db/src/runtime/errors.ts
+++ b/packages/db/src/runtime/errors.ts
@@ -1,4 +1,4 @@
-import { bold, red } from 'kleur/colors';
+import { bold } from 'kleur/colors';
 
 export const FOREIGN_KEY_DNE_ERROR = (tableName: string) => {
 	return `Table ${bold(
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 47a25b062215..76b1233f6f17 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -30,33 +30,30 @@ importers:
       '@changesets/cli':
         specifier: ^2.26.2
         version: 2.27.1
+      '@eslint/eslintrc':
+        specifier: ^3.0.2
+        version: 3.0.2
       '@types/node':
         specifier: ^18.17.8
         version: 18.19.30
-      '@typescript-eslint/eslint-plugin':
-        specifier: ^6.11.0
-        version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.2.2)
-      '@typescript-eslint/parser':
-        specifier: ^6.11.0
-        version: 6.21.0(eslint@8.57.0)(typescript@5.2.2)
       esbuild:
         specifier: ^0.19.6
         version: 0.19.12
       eslint:
-        specifier: ^8.54.0
-        version: 8.57.0
+        specifier: ^9.0.0
+        version: 9.0.0
       eslint-config-prettier:
         specifier: ^9.0.0
-        version: 9.1.0(eslint@8.57.0)
+        version: 9.1.0(eslint@9.0.0)
       eslint-plugin-no-only-tests:
         specifier: ^3.1.0
         version: 3.1.0
       eslint-plugin-prettier:
         specifier: ^5.0.0
-        version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5)
+        version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@9.0.0)(prettier@3.2.5)
       eslint-plugin-regexp:
         specifier: ^2.2.0
-        version: 2.5.0(eslint@8.57.0)
+        version: 2.5.0(eslint@9.0.0)
       globby:
         specifier: ^14.0.0
         version: 14.0.1
@@ -81,6 +78,9 @@ importers:
       typescript:
         specifier: ~5.2.2
         version: 5.2.2
+      typescript-eslint:
+        specifier: ^7.6.0
+        version: 7.6.0(eslint@9.0.0)(typescript@5.2.2)
 
   benchmark:
     dependencies:
@@ -7242,13 +7242,13 @@ packages:
     requiresBuild: true
     optional: true
 
-  /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0):
+  /@eslint-community/eslint-utils@4.4.0(eslint@9.0.0):
     resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
     dependencies:
-      eslint: 8.57.0
+      eslint: 9.0.0
       eslint-visitor-keys: 3.4.3
     dev: true
 
@@ -7257,14 +7257,14 @@ packages:
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
     dev: true
 
-  /@eslint/eslintrc@2.1.4:
-    resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  /@eslint/eslintrc@3.0.2:
+    resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     dependencies:
       ajv: 6.12.6
       debug: 4.3.4(supports-color@8.1.1)
-      espree: 9.6.1
-      globals: 13.24.0
+      espree: 10.0.1
+      globals: 14.0.0
       ignore: 5.3.1
       import-fresh: 3.3.0
       js-yaml: 4.1.0
@@ -7274,9 +7274,9 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint/js@8.57.0:
-    resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  /@eslint/js@9.0.0:
+    resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     dev: true
 
   /@fontsource/monofett@5.0.17:
@@ -7287,8 +7287,8 @@ packages:
     resolution: {integrity: sha512-ZJbsCIJp6VHL1wYQUPpyBjXMzwGdfFedrmrw4r5sFi7WrMpnfJv+el1uVO6yDPIqnVqkPvjJ+xeKgJwnj2LuQQ==}
     dev: false
 
-  /@humanwhocodes/config-array@0.11.14:
-    resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
+  /@humanwhocodes/config-array@0.12.3:
+    resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==}
     engines: {node: '>=10.10.0'}
     dependencies:
       '@humanwhocodes/object-schema': 2.0.3
@@ -8614,25 +8614,25 @@ packages:
     resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
     dev: true
 
-  /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0)(eslint@9.0.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
-      '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
-      eslint: ^7.0.0 || ^8.0.0
+      '@typescript-eslint/parser': ^7.0.0
+      eslint: ^8.56.0
       typescript: '*'
     peerDependenciesMeta:
       typescript:
         optional: true
     dependencies:
       '@eslint-community/regexpp': 4.10.0
-      '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2)
-      '@typescript-eslint/scope-manager': 6.21.0
-      '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2)
-      '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2)
-      '@typescript-eslint/visitor-keys': 6.21.0
+      '@typescript-eslint/parser': 7.6.0(eslint@9.0.0)(typescript@5.2.2)
+      '@typescript-eslint/scope-manager': 7.6.0
+      '@typescript-eslint/type-utils': 7.6.0(eslint@9.0.0)(typescript@5.2.2)
+      '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.2.2)
+      '@typescript-eslint/visitor-keys': 7.6.0
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.57.0
+      eslint: 9.0.0
       graphemer: 1.4.0
       ignore: 5.3.1
       natural-compare: 1.4.0
@@ -8643,75 +8643,75 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/parser@7.6.0(eslint@9.0.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
-      eslint: ^7.0.0 || ^8.0.0
+      eslint: ^8.56.0
       typescript: '*'
     peerDependenciesMeta:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/scope-manager': 6.21.0
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2)
-      '@typescript-eslint/visitor-keys': 6.21.0
+      '@typescript-eslint/scope-manager': 7.6.0
+      '@typescript-eslint/types': 7.6.0
+      '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.2.2)
+      '@typescript-eslint/visitor-keys': 7.6.0
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.57.0
+      eslint: 9.0.0
       typescript: 5.2.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/scope-manager@6.21.0:
-    resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/scope-manager@7.6.0:
+    resolution: {integrity: sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     dependencies:
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/visitor-keys': 6.21.0
+      '@typescript-eslint/types': 7.6.0
+      '@typescript-eslint/visitor-keys': 7.6.0
     dev: true
 
-  /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/type-utils@7.6.0(eslint@9.0.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
-      eslint: ^7.0.0 || ^8.0.0
+      eslint: ^8.56.0
       typescript: '*'
     peerDependenciesMeta:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2)
-      '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2)
+      '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.2.2)
+      '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.2.2)
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.57.0
+      eslint: 9.0.0
       ts-api-utils: 1.3.0(typescript@5.2.2)
       typescript: 5.2.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/types@6.21.0:
-    resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/types@7.6.0:
+    resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     dev: true
 
-  /@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2):
-    resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/typescript-estree@7.6.0(typescript@5.2.2):
+    resolution: {integrity: sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       typescript: '*'
     peerDependenciesMeta:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/visitor-keys': 6.21.0
+      '@typescript-eslint/types': 7.6.0
+      '@typescript-eslint/visitor-keys': 7.6.0
       debug: 4.3.4(supports-color@8.1.1)
       globby: 11.1.0
       is-glob: 4.0.3
-      minimatch: 9.0.3
+      minimatch: 9.0.4
       semver: 7.6.0
       ts-api-utils: 1.3.0(typescript@5.2.2)
       typescript: 5.2.2
@@ -8719,30 +8719,30 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/utils@7.6.0(eslint@9.0.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
-      eslint: ^7.0.0 || ^8.0.0
+      eslint: ^8.56.0
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0)
       '@types/json-schema': 7.0.15
       '@types/semver': 7.5.8
-      '@typescript-eslint/scope-manager': 6.21.0
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2)
-      eslint: 8.57.0
+      '@typescript-eslint/scope-manager': 7.6.0
+      '@typescript-eslint/types': 7.6.0
+      '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.2.2)
+      eslint: 9.0.0
       semver: 7.6.0
     transitivePeerDependencies:
       - supports-color
       - typescript
     dev: true
 
-  /@typescript-eslint/visitor-keys@6.21.0:
-    resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  /@typescript-eslint/visitor-keys@7.6.0:
+    resolution: {integrity: sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==}
+    engines: {node: ^18.18.0 || >=20.0.0}
     dependencies:
-      '@typescript-eslint/types': 6.21.0
+      '@typescript-eslint/types': 7.6.0
       eslint-visitor-keys: 3.4.3
     dev: true
 
@@ -10512,13 +10512,6 @@ packages:
   /dlv@1.1.3:
     resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
 
-  /doctrine@3.0.0:
-    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      esutils: 2.0.3
-    dev: true
-
   /dom-serializer@2.0.0:
     resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
     dependencies:
@@ -10910,13 +10903,13 @@ packages:
     resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
     engines: {node: '>=12'}
 
-  /eslint-config-prettier@9.1.0(eslint@8.57.0):
+  /eslint-config-prettier@9.1.0(eslint@9.0.0):
     resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
     hasBin: true
     peerDependencies:
       eslint: '>=7.0.0'
     dependencies:
-      eslint: 8.57.0
+      eslint: 9.0.0
     dev: true
 
   /eslint-plugin-no-only-tests@3.1.0:
@@ -10924,7 +10917,7 @@ packages:
     engines: {node: '>=5.0.0'}
     dev: true
 
-  /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5):
+  /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@9.0.0)(prettier@3.2.5):
     resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -10938,32 +10931,32 @@ packages:
       eslint-config-prettier:
         optional: true
     dependencies:
-      eslint: 8.57.0
-      eslint-config-prettier: 9.1.0(eslint@8.57.0)
+      eslint: 9.0.0
+      eslint-config-prettier: 9.1.0(eslint@9.0.0)
       prettier: 3.2.5
       prettier-linter-helpers: 1.0.0
       synckit: 0.8.8
     dev: true
 
-  /eslint-plugin-regexp@2.5.0(eslint@8.57.0):
+  /eslint-plugin-regexp@2.5.0(eslint@9.0.0):
     resolution: {integrity: sha512-I7vKcP0o75WS5SHiVNXN+Eshq49sbrweMQIuqSL3AId9AwDe9Dhbfug65vw64LxmOd4v+yf5l5Xt41y9puiq0g==}
     engines: {node: ^18 || >=20}
     peerDependencies:
       eslint: '>=8.44.0'
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0)
       '@eslint-community/regexpp': 4.10.0
       comment-parser: 1.4.1
-      eslint: 8.57.0
+      eslint: 9.0.0
       jsdoc-type-pratt-parser: 4.0.0
       refa: 0.12.1
       regexp-ast-analysis: 0.7.1
       scslre: 0.3.0
     dev: true
 
-  /eslint-scope@7.2.2:
-    resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  /eslint-scope@8.0.1:
+    resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     dependencies:
       esrecurse: 4.3.0
       estraverse: 5.3.0
@@ -10974,41 +10967,42 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /eslint@8.57.0:
-    resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  /eslint-visitor-keys@4.0.0:
+    resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    dev: true
+
+  /eslint@9.0.0:
+    resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     hasBin: true
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0)
       '@eslint-community/regexpp': 4.10.0
-      '@eslint/eslintrc': 2.1.4
-      '@eslint/js': 8.57.0
-      '@humanwhocodes/config-array': 0.11.14
+      '@eslint/eslintrc': 3.0.2
+      '@eslint/js': 9.0.0
+      '@humanwhocodes/config-array': 0.12.3
       '@humanwhocodes/module-importer': 1.0.1
       '@nodelib/fs.walk': 1.2.8
-      '@ungap/structured-clone': 1.2.0
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
       debug: 4.3.4(supports-color@8.1.1)
-      doctrine: 3.0.0
       escape-string-regexp: 4.0.0
-      eslint-scope: 7.2.2
-      eslint-visitor-keys: 3.4.3
-      espree: 9.6.1
+      eslint-scope: 8.0.1
+      eslint-visitor-keys: 4.0.0
+      espree: 10.0.1
       esquery: 1.5.0
       esutils: 2.0.3
       fast-deep-equal: 3.1.3
-      file-entry-cache: 6.0.1
+      file-entry-cache: 8.0.0
       find-up: 5.0.0
       glob-parent: 6.0.2
-      globals: 13.24.0
       graphemer: 1.4.0
       ignore: 5.3.1
       imurmurhash: 0.1.4
       is-glob: 4.0.3
       is-path-inside: 3.0.3
-      js-yaml: 4.1.0
       json-stable-stringify-without-jsonify: 1.0.1
       levn: 0.4.1
       lodash.merge: 4.6.2
@@ -11026,13 +11020,13 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
-  /espree@9.6.1:
-    resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  /espree@10.0.1:
+    resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     dependencies:
       acorn: 8.11.3
       acorn-jsx: 5.3.2(acorn@8.11.3)
-      eslint-visitor-keys: 3.4.3
+      eslint-visitor-keys: 4.0.0
     dev: true
 
   /esprima@4.0.1:
@@ -11252,11 +11246,11 @@ packages:
       web-streams-polyfill: 3.3.3
     dev: false
 
-  /file-entry-cache@6.0.1:
-    resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
-    engines: {node: ^10.12.0 || >=12.0.0}
+  /file-entry-cache@8.0.0:
+    resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+    engines: {node: '>=16.0.0'}
     dependencies:
-      flat-cache: 3.2.0
+      flat-cache: 4.0.1
     dev: true
 
   /file-uri-to-path@1.0.0:
@@ -11304,13 +11298,12 @@ packages:
       micromatch: 4.0.5
       pkg-dir: 4.2.0
 
-  /flat-cache@3.2.0:
-    resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
-    engines: {node: ^10.12.0 || >=12.0.0}
+  /flat-cache@4.0.1:
+    resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+    engines: {node: '>=16'}
     dependencies:
       flatted: 3.3.1
       keyv: 4.5.4
-      rimraf: 3.0.2
     dev: true
 
   /flat@5.0.2:
@@ -11578,11 +11571,9 @@ packages:
     engines: {node: '>=4'}
     dev: false
 
-  /globals@13.24.0:
-    resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      type-fest: 0.20.2
+  /globals@14.0.0:
+    resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+    engines: {node: '>=18'}
     dev: true
 
   /globalthis@1.0.3:
@@ -13544,13 +13535,6 @@ packages:
       brace-expansion: 2.0.1
     dev: true
 
-  /minimatch@9.0.3:
-    resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
-    engines: {node: '>=16 || 14 >=14.17'}
-    dependencies:
-      brace-expansion: 2.0.1
-    dev: true
-
   /minimatch@9.0.4:
     resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
     engines: {node: '>=16 || 14 >=14.17'}
@@ -16508,11 +16492,6 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /type-fest@0.20.2:
-    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
-    engines: {node: '>=10'}
-    dev: true
-
   /type-fest@0.6.0:
     resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
     engines: {node: '>=8'}
@@ -16598,6 +16577,25 @@ packages:
     dependencies:
       semver: 7.6.0
 
+  /typescript-eslint@7.6.0(eslint@9.0.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-LY6vH6F1l5jpGqRtU+uK4+mOecIb4Cd4kaz1hAiJrgnNiHUA8wiw8BkJyYS+MRLM69F1QuSKwtGlQqnGl1Rc6w==}
+    engines: {node: ^18.18.0 || >=20.0.0}
+    peerDependencies:
+      eslint: ^8.56.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@9.0.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 7.6.0(eslint@9.0.0)(typescript@5.2.2)
+      '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.2.2)
+      eslint: 9.0.0
+      typescript: 5.2.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /typescript@5.2.2:
     resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
     engines: {node: '>=14.17'}

From 983abc8b8cadc6ceb9f20d32d8415e2c5583f935 Mon Sep 17 00:00:00 2001
From: Jason 
Date: Mon, 15 Apr 2024 08:06:20 +0000
Subject: [PATCH 66/96] [ci] format

---
 eslint.config.js | 52 ++++++++++++++++++++++++------------------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/eslint.config.js b/eslint.config.js
index 230d06a2162a..33177f3c3706 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -1,14 +1,14 @@
 import path from 'node:path';
-import {fileURLToPath} from 'node:url';
-import {builtinModules} from "node:module";
+import { fileURLToPath } from 'node:url';
+import { builtinModules } from 'node:module';
 
-import {FlatCompat} from "@eslint/eslintrc";
+import { FlatCompat } from '@eslint/eslintrc';
 import tseslint from 'typescript-eslint';
 
 // plugins
 import prettierEslint from 'eslint-plugin-prettier';
 import noOnlyTestsEslint from 'eslint-plugin-no-only-tests';
-import regexpEslint from 'eslint-plugin-regexp'
+import regexpEslint from 'eslint-plugin-regexp';
 const typescriptEslint = tseslint.plugin;
 
 // parsers
@@ -20,7 +20,7 @@ const __dirname = path.dirname(__filename);
 // ref: https://eslint.org/docs/latest/use/configure/migration-guide#using-eslintrc-configs-in-flat-config
 // mimic CommonJS variables -- not needed if using CommonJS
 const compat = new FlatCompat({
-	baseDirectory: __dirname
+	baseDirectory: __dirname,
 });
 
 export default [
@@ -28,18 +28,18 @@ export default [
 	// ref: https://eslint.org/docs/latest/use/configure/configuration-files#globally-ignoring-files-with-ignores
 	{
 		ignores: [
-			"**/.*",
-			"**/*.d.ts",
-			"packages/**/*.min.js",
-			"packages/**/dist/",
-			"packages/**/fixtures/",
-			"packages/astro/vendor/vite/",
-			"benchmark/**/dist/",
-			"examples/",
-			"scripts/",
-			".github/",
-			".changeset/",
-		]
+			'**/.*',
+			'**/*.d.ts',
+			'packages/**/*.min.js',
+			'packages/**/dist/',
+			'packages/**/fixtures/',
+			'packages/astro/vendor/vite/',
+			'benchmark/**/dist/',
+			'examples/',
+			'scripts/',
+			'.github/',
+			'.changeset/',
+		],
 	},
 
 	...tseslint.configs.recommendedTypeChecked,
@@ -56,10 +56,10 @@ export default [
 			},
 		},
 		plugins: {
-			"@typescript-eslint": typescriptEslint,
-			"prettier": prettierEslint,
-			"no-only-tests": noOnlyTestsEslint,
-			"regexp": regexpEslint,
+			'@typescript-eslint': typescriptEslint,
+			prettier: prettierEslint,
+			'no-only-tests': noOnlyTestsEslint,
+			regexp: regexpEslint,
 		},
 		rules: {
 			// These off/configured-differently-by-default rules fit well for us
@@ -143,7 +143,7 @@ export default [
 		languageOptions: {
 			globals: {
 				browser: true,
-			}
+			},
 		},
 	},
 	{
@@ -152,7 +152,7 @@ export default [
 			globals: {
 				mocha: true,
 				globalThis: false, // false means read-only
-			}
+			},
 		},
 		rules: {
 			'no-console': 'off',
@@ -161,7 +161,7 @@ export default [
 	{
 		files: ['packages/integrations/**/*.ts'],
 		rules: {
-			'no-console': ['error', {allow: ['warn', 'error', 'info', 'debug']}],
+			'no-console': ['error', { allow: ['warn', 'error', 'info', 'debug'] }],
 		},
 	},
 	{
@@ -181,7 +181,7 @@ export default [
 		files: ['packages/astro/src/core/errors/errors-data.ts'],
 		rules: {
 			// This file is used for docs generation, as such the code need to be in a certain format, we can somewhat ensure this with these rules
-			'object-shorthand': ['error', 'methods', {avoidExplicitReturnArrows: true}],
+			'object-shorthand': ['error', 'methods', { avoidExplicitReturnArrows: true }],
 			'arrow-body-style': ['error', 'never'],
 		},
 	},
@@ -203,4 +203,4 @@ export default [
 			],
 		},
 	},
-]
+];

From 43d693c3089dd8f0fe7b46618f5555d43c936cad Mon Sep 17 00:00:00 2001
From: Juraj Kapsz 
Date: Mon, 15 Apr 2024 10:52:39 +0200
Subject: [PATCH 67/96] fix: picture fallback check (#10783)

---
 .changeset/modern-mugs-raise.md         | 5 +++++
 packages/astro/components/Picture.astro | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/modern-mugs-raise.md

diff --git a/.changeset/modern-mugs-raise.md b/.changeset/modern-mugs-raise.md
new file mode 100644
index 000000000000..0796acf9f8eb
--- /dev/null
+++ b/.changeset/modern-mugs-raise.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes Picture component specialFormatsFallback fallback check
diff --git a/packages/astro/components/Picture.astro b/packages/astro/components/Picture.astro
index f23ab6ccce7a..6dcc50c8e1d6 100644
--- a/packages/astro/components/Picture.astro
+++ b/packages/astro/components/Picture.astro
@@ -45,7 +45,7 @@ let resultFallbackFormat = fallbackFormat ?? defaultFallbackFormat;
 if (
 	!fallbackFormat &&
 	isESMImportedImage(originalSrc) &&
-	originalSrc.format in specialFormatsFallback
+	(specialFormatsFallback as ReadonlyArray).includes(originalSrc.format)
 ) {
 	resultFallbackFormat = originalSrc.format;
 }

From 01c746f3be2089d108d0a4ad5aa00d0d929f4692 Mon Sep 17 00:00:00 2001
From: Farzad 
Date: Mon, 15 Apr 2024 04:54:42 -0400
Subject: [PATCH 68/96] Fix @types/cookie dependency (#10776)

Co-authored-by: Florian Lefebvre 
---
 .changeset/brown-news-roll.md | 5 +++++
 packages/astro/package.json   | 2 +-
 pnpm-lock.yaml                | 8 ++++----
 3 files changed, 10 insertions(+), 5 deletions(-)
 create mode 100644 .changeset/brown-news-roll.md

diff --git a/.changeset/brown-news-roll.md b/.changeset/brown-news-roll.md
new file mode 100644
index 000000000000..ff57e1bc4054
--- /dev/null
+++ b/.changeset/brown-news-roll.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes cookies type inference
diff --git a/packages/astro/package.json b/packages/astro/package.json
index bdc85a699053..86b7ef650ffa 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -125,6 +125,7 @@
     "@babel/traverse": "^7.23.3",
     "@babel/types": "^7.23.3",
     "@types/babel__core": "^7.20.4",
+    "@types/cookie": "^0.5.4",
     "acorn": "^8.11.2",
     "aria-query": "^5.3.0",
     "axobject-query": "^4.0.0",
@@ -189,7 +190,6 @@
     "@types/chai": "^4.3.10",
     "@types/common-ancestor-path": "^1.0.2",
     "@types/connect": "^3.4.38",
-    "@types/cookie": "^0.5.4",
     "@types/cssesc": "^3.0.2",
     "@types/debug": "^4.1.12",
     "@types/diff": "^5.0.8",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 76b1233f6f17..cce5874f62b1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -536,6 +536,9 @@ importers:
       '@types/babel__core':
         specifier: ^7.20.4
         version: 7.20.5
+      '@types/cookie':
+        specifier: ^0.5.4
+        version: 0.5.4
       acorn:
         specifier: ^8.11.2
         version: 8.11.3
@@ -718,9 +721,6 @@ importers:
       '@types/connect':
         specifier: ^3.4.38
         version: 3.4.38
-      '@types/cookie':
-        specifier: ^0.5.4
-        version: 0.5.4
       '@types/cssesc':
         specifier: ^3.0.2
         version: 3.0.2
@@ -8288,7 +8288,7 @@ packages:
 
   /@types/cookie@0.5.4:
     resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==}
-    dev: true
+    dev: false
 
   /@types/cssesc@3.0.2:
     resolution: {integrity: sha512-Qii6nTRktvtI380EloxH/V7MwgrYxkPgBI+NklUjQuhzgAd1AqT3QDJd+eD+0doRADgfwvtagLRo7JFa7aMHXg==}

From 141eb7c726216224bd490748a1ca9576da8048b4 Mon Sep 17 00:00:00 2001
From: Martin Trapp <94928215+martrapp@users.noreply.github.com>
Date: Mon, 15 Apr 2024 10:58:40 +0200
Subject: [PATCH 69/96] Make viewTransition.finished wait for animations
 triggered by viewTransition.ready (#10787)

---
 .changeset/stupid-countries-warn.md      | 5 +++++
 packages/astro/src/transitions/router.ts | 4 +++-
 2 files changed, 8 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/stupid-countries-warn.md

diff --git a/.changeset/stupid-countries-warn.md b/.changeset/stupid-countries-warn.md
new file mode 100644
index 000000000000..27eeea281d4c
--- /dev/null
+++ b/.changeset/stupid-countries-warn.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes a timing issue in the view transition simulation.
diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts
index 0084a9d74ea2..e65b613c93e1 100644
--- a/packages/astro/src/transitions/router.ts
+++ b/packages/astro/src/transitions/router.ts
@@ -396,8 +396,10 @@ async function updateDOM(
 			const style = window.getComputedStyle(effect.target, effect.pseudoElement);
 			return style.animationIterationCount === 'infinite';
 		}
-		// Trigger the animations
 		const currentAnimations = document.getAnimations();
+		// allow animations triggered by viewTransition.ready to start
+		await new Promise((r)=>setTimeout(r));
+		// Trigger view transition animations waiting for data-astro-transition-fallback
 		document.documentElement.setAttribute(OLD_NEW_ATTR, phase);
 		const nextAnimations = document.getAnimations();
 		const newAnimations = nextAnimations.filter(

From 2f3851b7c2902910c21969252b8d0d94a164e06b Mon Sep 17 00:00:00 2001
From: Martin Trapp 
Date: Mon, 15 Apr 2024 08:59:52 +0000
Subject: [PATCH 70/96] [ci] format

---
 packages/astro/src/transitions/router.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts
index e65b613c93e1..e0ffb4d7eef4 100644
--- a/packages/astro/src/transitions/router.ts
+++ b/packages/astro/src/transitions/router.ts
@@ -398,7 +398,7 @@ async function updateDOM(
 		}
 		const currentAnimations = document.getAnimations();
 		// allow animations triggered by viewTransition.ready to start
-		await new Promise((r)=>setTimeout(r));
+		await new Promise((r) => setTimeout(r));
 		// Trigger view transition animations waiting for data-astro-transition-fallback
 		document.documentElement.setAttribute(OLD_NEW_ATTR, phase);
 		const nextAnimations = document.getAnimations();

From e7bad70d5cab5ceccb9387bef0092469a029d7cb Mon Sep 17 00:00:00 2001
From: Erika <3019731+Princesseuh@users.noreply.github.com>
Date: Mon, 15 Apr 2024 05:06:30 -0400
Subject: [PATCH 71/96] fix(assets): Forward headers from the original request
 to the internal request to the image (#10775)

---
 .changeset/rich-spoons-fold.md                |  5 +++++
 packages/astro/src/assets/endpoint/generic.ts | 14 +++++++++-----
 2 files changed, 14 insertions(+), 5 deletions(-)
 create mode 100644 .changeset/rich-spoons-fold.md

diff --git a/.changeset/rich-spoons-fold.md b/.changeset/rich-spoons-fold.md
new file mode 100644
index 000000000000..217562a24ce8
--- /dev/null
+++ b/.changeset/rich-spoons-fold.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes assets endpoint in serverless returning 404 in certain situations where the website might be under a protected route
diff --git a/packages/astro/src/assets/endpoint/generic.ts b/packages/astro/src/assets/endpoint/generic.ts
index 22b15446da75..5c51f6575534 100644
--- a/packages/astro/src/assets/endpoint/generic.ts
+++ b/packages/astro/src/assets/endpoint/generic.ts
@@ -7,9 +7,12 @@ import { isRemoteAllowed } from '../utils/remotePattern.js';
 // @ts-expect-error
 import { imageConfig } from 'astro:assets';
 
-async function loadRemoteImage(src: URL) {
+async function loadRemoteImage(src: URL, headers: Headers) {
 	try {
-		const res = await fetch(src);
+		const res = await fetch(src, {
+			// Forward all headers from the original request
+			headers,
+		});
 
 		if (!res.ok) {
 			return undefined;
@@ -41,15 +44,16 @@ export const GET: APIRoute = async ({ request }) => {
 
 		let inputBuffer: ArrayBuffer | undefined = undefined;
 
-		const sourceUrl = isRemotePath(transform.src)
+		const isRemoteImage = isRemotePath(transform.src);
+		const sourceUrl = isRemoteImage
 			? new URL(transform.src)
 			: new URL(transform.src, url.origin);
 
-		if (isRemotePath(transform.src) && isRemoteAllowed(transform.src, imageConfig) === false) {
+		if (isRemoteImage && isRemoteAllowed(transform.src, imageConfig) === false) {
 			return new Response('Forbidden', { status: 403 });
 		}
 
-		inputBuffer = await loadRemoteImage(sourceUrl);
+		inputBuffer = await loadRemoteImage(sourceUrl, isRemoteImage ? new Headers() : request.headers);
 
 		if (!inputBuffer) {
 			return new Response('Not Found', { status: 404 });

From a223b201e6baf625254e9b8f14363ecb1c0dac04 Mon Sep 17 00:00:00 2001
From: Erika 
Date: Mon, 15 Apr 2024 09:07:35 +0000
Subject: [PATCH 72/96] [ci] format

---
 packages/astro/src/assets/endpoint/generic.ts | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/packages/astro/src/assets/endpoint/generic.ts b/packages/astro/src/assets/endpoint/generic.ts
index 5c51f6575534..3dd5140cf199 100644
--- a/packages/astro/src/assets/endpoint/generic.ts
+++ b/packages/astro/src/assets/endpoint/generic.ts
@@ -45,9 +45,7 @@ export const GET: APIRoute = async ({ request }) => {
 		let inputBuffer: ArrayBuffer | undefined = undefined;
 
 		const isRemoteImage = isRemotePath(transform.src);
-		const sourceUrl = isRemoteImage
-			? new URL(transform.src)
-			: new URL(transform.src, url.origin);
+		const sourceUrl = isRemoteImage ? new URL(transform.src) : new URL(transform.src, url.origin);
 
 		if (isRemoteImage && isRemoteAllowed(transform.src, imageConfig) === false) {
 			return new Response('Forbidden', { status: 403 });

From 1b79479fc01553cc688d8456b832650f84462bb8 Mon Sep 17 00:00:00 2001
From: Meghan Denny 
Date: Mon, 15 Apr 2024 02:12:07 -0700
Subject: [PATCH 73/96] astro/cli/install-package.ts: whichPm may return null
 if ran in an empty directory (#10782)

---
 .changeset/many-hairs-jump.md             | 5 +++++
 packages/astro/src/cli/install-package.ts | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/many-hairs-jump.md

diff --git a/.changeset/many-hairs-jump.md b/.changeset/many-hairs-jump.md
new file mode 100644
index 000000000000..2e855708fb89
--- /dev/null
+++ b/.changeset/many-hairs-jump.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Handles possible null value when calling `which-pm` during dynamic package installation
diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts
index 02e856846484..7c8601e48a8c 100644
--- a/packages/astro/src/cli/install-package.ts
+++ b/packages/astro/src/cli/install-package.ts
@@ -101,7 +101,7 @@ async function installPackage(
 	logger: Logger
 ): Promise {
 	const cwd = options.cwd ?? process.cwd();
-	const packageManager = (await whichPm(cwd)).name ?? 'npm';
+	const packageManager = (await whichPm(cwd))?.name ?? 'npm';
 	const installCommand = getInstallCommand(packageNames, packageManager);
 
 	if (!installCommand) {

From ba9459cb9b6213f9f36c9a36e9efb8d0193a44f2 Mon Sep 17 00:00:00 2001
From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com>
Date: Mon, 15 Apr 2024 06:13:11 -0700
Subject: [PATCH 74/96] [ci] update lockfile (#10791)

Co-authored-by: matthewp 
---
 pnpm-lock.yaml | 777 ++++++++++++++++++++++++-------------------------
 1 file changed, 377 insertions(+), 400 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cce5874f62b1..7981235d2cf9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -35,7 +35,7 @@ importers:
         version: 3.0.2
       '@types/node':
         specifier: ^18.17.8
-        version: 18.19.30
+        version: 18.19.31
       esbuild:
         specifier: ^0.19.6
         version: 0.19.12
@@ -207,16 +207,16 @@ importers:
         version: link:../../packages/integrations/vue
       '@types/react':
         specifier: ^18.2.37
-        version: 18.2.74
+        version: 18.2.78
       '@types/react-dom':
         specifier: ^18.2.15
-        version: 18.2.24
+        version: 18.2.25
       astro:
         specifier: ^4.6.1
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.2.0
         version: 18.2.0
@@ -228,7 +228,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -240,13 +240,13 @@ importers:
         version: link:../../packages/integrations/preact
       '@preact/signals':
         specifier: ^1.2.1
-        version: 1.2.1(preact@10.20.1)
+        version: 1.2.1(preact@10.20.2)
       astro:
         specifier: ^4.6.1
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   examples/framework-react:
     dependencies:
@@ -255,10 +255,10 @@ importers:
         version: link:../../packages/integrations/react
       '@types/react':
         specifier: ^18.2.37
-        version: 18.2.74
+        version: 18.2.78
       '@types/react-dom':
         specifier: ^18.2.15
-        version: 18.2.24
+        version: 18.2.25
       astro:
         specifier: ^4.6.1
         version: link:../../packages/astro
@@ -291,7 +291,7 @@ importers:
         version: link:../../packages/astro
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   examples/framework-vue:
     dependencies:
@@ -367,7 +367,7 @@ importers:
         version: link:../../packages/astro
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   examples/starlog:
     dependencies:
@@ -376,7 +376,7 @@ importers:
         version: link:../../packages/astro
       sass:
         specifier: ^1.69.5
-        version: 1.74.1
+        version: 1.75.0
       sharp:
         specifier: ^0.32.6
         version: 0.32.6
@@ -445,7 +445,7 @@ importers:
         version: link:../../packages/astro
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   examples/with-nanostores:
     dependencies:
@@ -454,7 +454,7 @@ importers:
         version: link:../../packages/integrations/preact
       '@nanostores/preact':
         specifier: ^0.5.0
-        version: 0.5.1(nanostores@0.9.5)(preact@10.20.1)
+        version: 0.5.1(nanostores@0.9.5)(preact@10.20.2)
       astro:
         specifier: ^4.6.1
         version: link:../../packages/astro
@@ -463,7 +463,7 @@ importers:
         version: 0.9.5
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   examples/with-tailwindcss:
     dependencies:
@@ -499,7 +499,7 @@ importers:
         version: link:../../packages/astro
       vitest:
         specifier: ^1.3.1
-        version: 1.4.0(@types/node@18.19.30)
+        version: 1.5.0(@types/node@18.19.31)
 
   packages/astro:
     dependencies:
@@ -658,7 +658,7 @@ importers:
         version: 7.6.0
       shiki:
         specifier: ^1.1.2
-        version: 1.2.4
+        version: 1.3.0
       string-width:
         specifier: ^7.0.0
         version: 7.1.0
@@ -676,7 +676,7 @@ importers:
         version: 6.0.1
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
       vitefu:
         specifier: ^0.2.5
         version: 0.2.5(vite@5.2.8)
@@ -786,7 +786,7 @@ importers:
         version: 0.9.1
       memfs:
         specifier: ^4.6.0
-        version: 4.8.1
+        version: 4.8.2
       node-mocks-http:
         specifier: ^1.13.0
         version: 1.14.1
@@ -807,10 +807,10 @@ importers:
         version: 0.1.2
       rollup:
         specifier: ^4.5.0
-        version: 4.14.1
+        version: 4.14.3
       sass:
         specifier: ^1.69.5
-        version: 1.74.1
+        version: 1.75.0
       srcset-parse:
         specifier: ^1.1.0
         version: 1.1.0
@@ -872,7 +872,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/e2e/fixtures/astro-envs:
     dependencies:
@@ -890,7 +890,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -902,7 +902,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -966,7 +966,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/e2e/fixtures/error-cyclic:
     dependencies:
@@ -978,7 +978,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/e2e/fixtures/error-sass:
     dependencies:
@@ -987,7 +987,7 @@ importers:
         version: link:../../..
       sass:
         specifier: ^1.69.5
-        version: 1.74.1
+        version: 1.75.0
 
   packages/astro/e2e/fixtures/errors:
     dependencies:
@@ -1011,7 +1011,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1020,13 +1020,13 @@ importers:
         version: 18.2.0(react@18.2.0)
       sass:
         specifier: ^1.69.5
-        version: 1.74.1
+        version: 1.75.0
       solid-js:
         specifier: ^1.8.5
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1038,7 +1038,7 @@ importers:
         version: link:../../..
       sass:
         specifier: ^1.69.5
-        version: 1.74.1
+        version: 1.75.0
 
   packages/astro/e2e/fixtures/hydration-race:
     dependencies:
@@ -1050,7 +1050,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/e2e/fixtures/i18n:
     dependencies:
@@ -1083,7 +1083,7 @@ importers:
         version: 2.8.0
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1095,7 +1095,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1126,7 +1126,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
     devDependencies:
       '@astrojs/mdx':
         specifier: workspace:*
@@ -1142,7 +1142,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1154,7 +1154,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1182,7 +1182,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1194,7 +1194,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1222,7 +1222,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1234,7 +1234,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1262,7 +1262,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1274,7 +1274,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1302,7 +1302,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1314,7 +1314,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1342,7 +1342,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -1354,7 +1354,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1410,7 +1410,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/e2e/fixtures/preact-component:
     dependencies:
@@ -1425,7 +1425,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/e2e/fixtures/preact-lazy-component:
     dependencies:
@@ -1440,7 +1440,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.15.1
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/e2e/fixtures/prefetch:
     dependencies:
@@ -1520,7 +1520,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/e2e/fixtures/tailwindcss:
     dependencies:
@@ -1580,7 +1580,7 @@ importers:
         version: 18.2.0(react@18.2.0)
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1628,10 +1628,10 @@ importers:
         version: link:../utils
       '@types/react':
         specifier: ^18.2.37
-        version: 18.2.74
+        version: 18.2.78
       '@types/react-dom':
         specifier: ^18.2.15
-        version: 18.2.24
+        version: 18.2.25
       astro:
         specifier: workspace:*
         version: link:../../..
@@ -1655,10 +1655,10 @@ importers:
         version: link:../utils
       '@types/react':
         specifier: ^18.2.37
-        version: 18.2.74
+        version: 18.2.78
       '@types/react-dom':
         specifier: ^18.2.15
-        version: 18.2.24
+        version: 18.2.25
       astro:
         specifier: workspace:*
         version: link:../../..
@@ -1682,10 +1682,10 @@ importers:
         version: link:../utils
       '@types/react':
         specifier: ^18.2.37
-        version: 18.2.74
+        version: 18.2.78
       '@types/react-dom':
         specifier: ^18.2.15
-        version: 18.2.24
+        version: 18.2.25
       astro:
         specifier: workspace:*
         version: link:../../..
@@ -1730,7 +1730,7 @@ importers:
         version: 18.2.0(react@18.2.0)
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1745,7 +1745,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/alias-tsconfig:
     dependencies:
@@ -1760,7 +1760,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/alias-tsconfig-baseurl-only:
     dependencies:
@@ -1772,7 +1772,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/alias-tsconfig/deps/namespace-package: {}
 
@@ -1843,7 +1843,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/astro-check-errors:
     dependencies:
@@ -1879,10 +1879,10 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -1915,7 +1915,7 @@ importers:
         version: 18.2.0(react@18.2.0)
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/astro-client-only/pkg: {}
 
@@ -2001,7 +2001,7 @@ importers:
         version: 18.2.0(react@18.2.0)
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/astro-envs:
     dependencies:
@@ -2025,7 +2025,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/astro-external-files:
     dependencies:
@@ -2043,7 +2043,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/astro-generator:
     dependencies:
@@ -2253,7 +2253,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/astro-slots:
     dependencies:
@@ -2283,7 +2283,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.2.0
         version: 18.2.0
@@ -2295,7 +2295,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -2310,7 +2310,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/build-assets:
     dependencies:
@@ -2322,7 +2322,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/build-readonly-file:
     dependencies:
@@ -2361,7 +2361,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -2370,13 +2370,13 @@ importers:
         version: 18.2.0(react@18.2.0)
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/component-library-shared:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.2.0
         version: 18.2.0
@@ -2586,7 +2586,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/css-import-as-inline:
     dependencies:
@@ -2769,7 +2769,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/error-bad-js:
     dependencies:
@@ -2805,10 +2805,10 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -2895,7 +2895,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/i18n-routing:
     dependencies:
@@ -2994,7 +2994,7 @@ importers:
     dependencies:
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -3006,7 +3006,7 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -3188,14 +3188,14 @@ importers:
         version: 1.8.16
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
     devDependencies:
       postcss-preset-env:
         specifier: ^9.3.0
-        version: 9.5.4(postcss@8.4.38)
+        version: 9.5.5(postcss@8.4.38)
 
   packages/astro/test/fixtures/preact-compat-component:
     dependencies:
@@ -3210,7 +3210,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/preact-compat-component/packages/react-lib:
     dependencies:
@@ -3225,13 +3225,13 @@ importers:
         version: link:../../../../integrations/preact
       '@preact/signals':
         specifier: 1.2.1
-        version: 1.2.1(preact@10.20.1)
+        version: 1.2.1(preact@10.20.2)
       astro:
         specifier: workspace:*
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/public-base-404:
     dependencies:
@@ -3292,7 +3292,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/remote-css:
     dependencies:
@@ -3343,7 +3343,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/slots-react:
     dependencies:
@@ -3391,7 +3391,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/slots-vue:
     dependencies:
@@ -3502,7 +3502,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/ssr-error-pages:
     dependencies:
@@ -3589,7 +3589,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/ssr-split-manifest:
     dependencies:
@@ -3610,7 +3610,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/astro/test/fixtures/static-build-code-component:
     dependencies:
@@ -3637,7 +3637,7 @@ importers:
         version: link:../../..
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
       react:
         specifier: ^18.1.0
         version: 18.2.0
@@ -3690,7 +3690,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
 
   packages/astro/test/fixtures/tailwindcss:
     dependencies:
@@ -3813,7 +3813,7 @@ importers:
         version: link:../../..
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -3873,7 +3873,7 @@ importers:
         version: 1.0.2
       drizzle-orm:
         specifier: ^0.30.4
-        version: 0.30.7(@libsql/client@0.5.6)
+        version: 0.30.8(@libsql/client@0.5.6)
       github-slugger:
         specifier: ^2.0.0
         version: 2.0.0
@@ -3937,10 +3937,10 @@ importers:
         version: 10.4.0
       typescript:
         specifier: ^5.2.2
-        version: 5.4.4
+        version: 5.4.5
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
 
   packages/db/test/fixtures/basics:
     dependencies:
@@ -4036,7 +4036,7 @@ importers:
     dependencies:
       '@astrojs/check':
         specifier: ^0.5.5
-        version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4)
+        version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5)
       '@astrojs/db':
         specifier: workspace:*
         version: link:../../..
@@ -4048,10 +4048,10 @@ importers:
         version: link:../../../../integrations/react
       '@types/react':
         specifier: ^18.2.57
-        version: 18.2.74
+        version: 18.2.78
       '@types/react-dom':
         specifier: ^18.2.19
-        version: 18.2.24
+        version: 18.2.25
       astro:
         specifier: workspace:*
         version: link:../../../../astro
@@ -4069,7 +4069,7 @@ importers:
         version: 0.1.12(astro@packages+astro)(zod@3.22.4)
       typescript:
         specifier: ^5.3.2
-        version: 5.4.4
+        version: 5.4.5
       zod:
         specifier: ^3.22.4
         version: 3.22.4
@@ -4087,7 +4087,7 @@ importers:
         version: link:../../../scripts
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
 
   packages/integrations/alpinejs/test/fixtures/basics:
     dependencies:
@@ -4165,7 +4165,7 @@ importers:
         version: 3.1.2
       sass:
         specifier: ^1.69.5
-        version: 1.74.1
+        version: 1.75.0
 
   packages/integrations/markdoc:
     dependencies:
@@ -4220,7 +4220,7 @@ importers:
         version: 0.16.11
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
 
   packages/integrations/markdoc/test/fixtures/content-collections:
     dependencies:
@@ -4325,7 +4325,7 @@ importers:
         version: link:../../../../../astro
       preact:
         specifier: ^10.20.1
-        version: 10.20.1
+        version: 10.20.2
 
   packages/integrations/markdoc/test/fixtures/render-with-config:
     dependencies:
@@ -4461,7 +4461,7 @@ importers:
         version: 11.0.4
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
 
   packages/integrations/mdx/test/fixtures/css-head-mdx:
     dependencies:
@@ -4530,7 +4530,7 @@ importers:
         version: link:../../../../../astro
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/integrations/mdx/test/fixtures/mdx-namespace:
     dependencies:
@@ -4614,7 +4614,7 @@ importers:
     devDependencies:
       '@types/node':
         specifier: ^18.17.8
-        version: 18.19.30
+        version: 18.19.31
       '@types/send':
         specifier: ^0.17.4
         version: 0.17.4
@@ -4789,19 +4789,19 @@ importers:
         version: 7.22.5
       '@preact/preset-vite':
         specifier: ^2.7.0
-        version: 2.8.2(preact@10.20.1)
+        version: 2.8.2(preact@10.20.2)
       '@preact/signals':
         specifier: ^1.2.1
-        version: 1.2.1(preact@10.20.1)
+        version: 1.2.1(preact@10.20.2)
       babel-plugin-transform-hook-names:
         specifier: ^1.0.2
         version: 1.0.2
       preact-render-to-string:
         specifier: ~6.3.1
-        version: 6.3.1(preact@10.20.1)
+        version: 6.3.1(preact@10.20.2)
       preact-ssr-prepass:
         specifier: ^1.2.1
-        version: 1.2.1(preact@10.20.1)
+        version: 1.2.1(preact@10.20.2)
     devDependencies:
       astro:
         specifier: workspace:*
@@ -4811,7 +4811,7 @@ importers:
         version: link:../../../scripts
       preact:
         specifier: ^10.19.2
-        version: 10.20.1
+        version: 10.20.2
 
   packages/integrations/react:
     dependencies:
@@ -4824,10 +4824,10 @@ importers:
     devDependencies:
       '@types/react':
         specifier: ^18.2.37
-        version: 18.2.74
+        version: 18.2.78
       '@types/react-dom':
         specifier: ^18.2.15
-        version: 18.2.24
+        version: 18.2.25
       astro:
         specifier: workspace:*
         version: link:../../astro
@@ -4845,7 +4845,7 @@ importers:
         version: 18.2.0(react@18.2.0)
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
 
   packages/integrations/react/test/fixtures/react-component:
     dependencies:
@@ -4946,10 +4946,10 @@ importers:
     dependencies:
       '@sveltejs/vite-plugin-svelte':
         specifier: ^3.0.0
-        version: 3.0.2(svelte@4.2.12)(vite@5.2.8)
+        version: 3.1.0(svelte@4.2.14)(vite@5.2.8)
       svelte2tsx:
         specifier: ^0.6.27
-        version: 0.6.27(svelte@4.2.12)(typescript@5.2.2)
+        version: 0.6.27(svelte@4.2.14)(typescript@5.2.2)
     devDependencies:
       astro:
         specifier: workspace:*
@@ -4959,10 +4959,10 @@ importers:
         version: link:../../../scripts
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
 
   packages/integrations/tailwind:
     dependencies:
@@ -4987,7 +4987,7 @@ importers:
         version: 3.4.3
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
 
   packages/integrations/tailwind/test/fixtures/basic:
     dependencies:
@@ -5247,7 +5247,7 @@ importers:
         version: 0.16.11
       vite:
         specifier: ^5.1.4
-        version: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+        version: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
       vue:
         specifier: ^3.3.8
         version: 3.4.21(typescript@5.2.2)
@@ -5370,7 +5370,7 @@ importers:
         version: 2.1.0
       shiki:
         specifier: ^1.1.2
-        version: 1.2.4
+        version: 1.3.0
       unified:
         specifier: ^11.0.4
         version: 11.0.4
@@ -5447,7 +5447,7 @@ importers:
         version: 1.1.4
       '@types/node':
         specifier: ^18.17.8
-        version: 18.19.30
+        version: 18.19.31
       '@types/which-pm-runs':
         specifier: ^1.0.2
         version: 1.0.2
@@ -5514,7 +5514,7 @@ importers:
         version: 5.0.0
       svelte:
         specifier: ^4.2.5
-        version: 4.2.12
+        version: 4.2.14
       tar:
         specifier: ^6.1.15
         version: 6.2.1
@@ -5563,8 +5563,8 @@ packages:
       astro: '*'
     dependencies:
       '@astro-community/astro-embed-twitter': 0.5.4(astro@packages+astro)
-      '@astro-community/astro-embed-vimeo': 0.3.6(astro@packages+astro)
-      '@astro-community/astro-embed-youtube': 0.5.1(astro@packages+astro)
+      '@astro-community/astro-embed-vimeo': 0.3.7(astro@packages+astro)
+      '@astro-community/astro-embed-youtube': 0.5.2(astro@packages+astro)
       '@types/unist': 2.0.10
       astro: link:packages/astro
       astro-auto-import: 0.4.2(astro@packages+astro)
@@ -5586,16 +5586,17 @@ packages:
       linkedom: 0.14.26
     dev: false
 
-  /@astro-community/astro-embed-vimeo@0.3.6(astro@packages+astro):
-    resolution: {integrity: sha512-WBf1vjabXqEQ0n+F9wxuJt4kGXAe8TEvMb3mF7q3CU1KmRJrBGp9Wy6Mpl9LJIau4OiC3PZ58TmpSohELT26Ug==}
+  /@astro-community/astro-embed-vimeo@0.3.7(astro@packages+astro):
+    resolution: {integrity: sha512-0Y08IOudqSLC/RKiYZagaG/uvfblSt7of+hrIcRky7u+KZK3VrTbZ/Np+nIq81jXLGJQPXN8TNGsOUsY0mw9lw==}
     peerDependencies:
       astro: '*'
     dependencies:
+      '@astro-community/astro-embed-utils': 0.1.2
       astro: link:packages/astro
     dev: false
 
-  /@astro-community/astro-embed-youtube@0.5.1(astro@packages+astro):
-    resolution: {integrity: sha512-IvjCCpaNZD7xrcgD/WZIRlpRphAUlwOZtR0IOI0pSNijegPOBghygYHeU81WvRnK2Fwuw2RTmGo8PbVZ15wp1w==}
+  /@astro-community/astro-embed-youtube@0.5.2(astro@packages+astro):
+    resolution: {integrity: sha512-cckWcq7mFCmI6uPpIlRolSafSQRYZBOaxIc8DaCUh8+JQAtPF7O4EdpRpZBUcvbARrWEEyHJCWrt0XOGppMniw==}
     peerDependencies:
       astro: '*'
     dependencies:
@@ -5620,17 +5621,17 @@ packages:
       - prettier-plugin-astro
     dev: true
 
-  /@astrojs/check@0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4):
+  /@astrojs/check@0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5):
     resolution: {integrity: sha512-vliHXM9cu/viGeKiksUM4mXfO816ohWtawTl2ADPgTsd4nUMjFiyAl7xFZhF34yy4hq4qf7jvK1F2PlR3b5I5w==}
     hasBin: true
     peerDependencies:
       typescript: ^5.0.0
     dependencies:
-      '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4)
+      '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5)
       chokidar: 3.6.0
       fast-glob: 3.3.2
       kleur: 4.1.5
-      typescript: 5.4.4
+      typescript: 5.4.5
       yargs: 17.7.2
     transitivePeerDependencies:
       - prettier
@@ -5694,7 +5695,7 @@ packages:
       - typescript
     dev: true
 
-  /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.4):
+  /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.4.5):
     resolution: {integrity: sha512-sJH5vGTBkhgA8+hdhzX78UUp4cFz4Mt7xkEkevD188OS5bDMkaue6hK+dtXWM47mnrXFveXA2u38K7S+5+IRjA==}
     hasBin: true
     peerDependencies:
@@ -5708,7 +5709,7 @@ packages:
     dependencies:
       '@astrojs/compiler': 2.7.1
       '@jridgewell/sourcemap-codec': 1.4.15
-      '@volar/kit': 2.1.6(typescript@5.4.4)
+      '@volar/kit': 2.1.6(typescript@5.4.5)
       '@volar/language-core': 2.1.6
       '@volar/language-server': 2.1.6
       '@volar/language-service': 2.1.6
@@ -7548,7 +7549,7 @@ packages:
       '@libsql/core': 0.5.6
       '@libsql/hrana-client': 0.5.6
       js-base64: 3.7.7
-      libsql: 0.3.10
+      libsql: 0.3.12
     transitivePeerDependencies:
       - bufferutil
       - encoding
@@ -7561,16 +7562,16 @@ packages:
       js-base64: 3.7.7
     dev: false
 
-  /@libsql/darwin-arm64@0.3.10:
-    resolution: {integrity: sha512-RaexEFfPAFogd6dJlqkpCkTxdr6K14Z0286lodIJ8Ny77mWuWyBkWKxf70OYWXXAMxMJFUW+6al1F3/Osf/pTg==}
+  /@libsql/darwin-arm64@0.3.12:
+    resolution: {integrity: sha512-rBiMebxLgsShSEg73CibeuenlUMKXnaW/XoUk3tii1C1U7141w6k5VuF6/jnNl/cS7PMK/vy+2V5N/k++yvb9A==}
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
     dev: false
     optional: true
 
-  /@libsql/darwin-x64@0.3.10:
-    resolution: {integrity: sha512-SNVN6n4qNUdMW1fJMFmx4qn4n5RnXsxjFbczpkzG/V7m/5VeTFt1chhGcrahTHCr3+K6eRJWJUEQHRGqjBwPkw==}
+  /@libsql/darwin-x64@0.3.12:
+    resolution: {integrity: sha512-T1yXSG1WukLq41hEWTU3G1kuV9TVoc+90KFs1KGluLrGvpj5l1QIff35hQlWWi6c1tfPsdlydR6qIO6AZdUwNg==}
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
@@ -7609,40 +7610,40 @@ packages:
       - utf-8-validate
     dev: false
 
-  /@libsql/linux-arm64-gnu@0.3.10:
-    resolution: {integrity: sha512-2uXpi9d8qtyIOr7pyG4a88j6YXgemyIHEs2Wbp+PPletlCIPsFS+E7IQHbz8VwTohchOzcokGUm1Bc5QC+A7wg==}
+  /@libsql/linux-arm64-gnu@0.3.12:
+    resolution: {integrity: sha512-1tmLuj02vySklkadwYEjvXFhyipyNr7oufe55tJK0hqvjQEcqfzBqAD3AHvPo41ug0qlrB2GRpiBlJtcIu2dMQ==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: false
     optional: true
 
-  /@libsql/linux-arm64-musl@0.3.10:
-    resolution: {integrity: sha512-72SN1FUavLvzHddCS861ynSpQndcW5oLGKA3U8CyMfgIZIwJAPc7+48Uj1plW00htXBx4GBpcntFp68KKIx3YQ==}
+  /@libsql/linux-arm64-musl@0.3.12:
+    resolution: {integrity: sha512-sM2NJTYe1FiixpJbebTllfV6uuSB1WIOfgQVHb7cJP0Jik5Kyq5F9n4reF6QKRivbPAn3kk6f5uRZKHBE6rvXw==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: false
     optional: true
 
-  /@libsql/linux-x64-gnu@0.3.10:
-    resolution: {integrity: sha512-hXyNqVRi7ONuyWZ1SX6setxL0QaQ7InyS3bHLupsi9s7NpOGD5vcpTaYicJOqmIIm+6kt8vJfmo7ZxlarIHy7Q==}
+  /@libsql/linux-x64-gnu@0.3.12:
+    resolution: {integrity: sha512-x8+Qo09osyOWs0/+D48Ml+CMlU33yCXznv4PYfQJc1NWA0dcQkSK353raYebH+cJhNIv0RcEz3ltTT3ME+HwAQ==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: false
     optional: true
 
-  /@libsql/linux-x64-musl@0.3.10:
-    resolution: {integrity: sha512-kNmIRxomVwt9S+cLyYS497F/3gXFF4r8wW12YSBQgxG75JYft07AHVd8J7HINg+oqRkLzT0s+mVX5dM6nk68EQ==}
+  /@libsql/linux-x64-musl@0.3.12:
+    resolution: {integrity: sha512-wY5G8zx727wvg5n/qB4oK357u3HQlz84oNG0XTrKnJVCxqR91Yg6bU+fKsGrvyaGFEqLmZ/Ft0K0pi6Mn/k4vQ==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: false
     optional: true
 
-  /@libsql/win32-x64-msvc@0.3.10:
-    resolution: {integrity: sha512-c/6rjdtGULKrJkLgfLobFefObfOtxjXGmCfPxv6pr0epPCeUEssfDbDIeEH9fQUgzogIMWEHwT8so52UJ/iT1Q==}
+  /@libsql/win32-x64-msvc@0.3.12:
+    resolution: {integrity: sha512-ko9Ph0ssQk2rUiNXfbquZ4fXXKb/E47GE6+caA4gNt4+rgFc1ksaffekYwym24Zk4VDYsvAQNOpwgd9baIBzLA==}
     cpu: [x64]
     os: [win32]
     requiresBuild: true
@@ -7668,7 +7669,7 @@ packages:
       '@lit-labs/ssr-dom-shim': 1.2.0
       '@lit/reactive-element': 2.0.4
       '@parse5/tools': 0.3.0
-      '@types/node': 16.18.95
+      '@types/node': 16.18.96
       enhanced-resolve: 5.16.0
       lit: 3.1.2
       lit-element: 4.0.4
@@ -7747,7 +7748,7 @@ packages:
       '@types/estree': 1.0.5
       '@types/estree-jsx': 1.0.5
       '@types/hast': 3.0.4
-      '@types/mdx': 2.0.12
+      '@types/mdx': 2.0.13
       collapse-white-space: 2.1.0
       devlop: 1.1.0
       estree-util-build-jsx: 3.0.1
@@ -7771,7 +7772,7 @@ packages:
       - supports-color
     dev: false
 
-  /@nanostores/preact@0.5.1(nanostores@0.9.5)(preact@10.20.1):
+  /@nanostores/preact@0.5.1(nanostores@0.9.5)(preact@10.20.2):
     resolution: {integrity: sha512-kofyeDwzM3TrOd37ay+Xxgk3Cn6jih23dxELc7Mr9IJV55jmWATfNP9b7O/awwCL7CE5z5PfzFnNk/W+tMaWGw==}
     engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
@@ -7779,7 +7780,7 @@ packages:
       preact: '>=10.0.0'
     dependencies:
       nanostores: 0.9.5
-      preact: 10.20.1
+      preact: 10.20.2
     dev: false
 
   /@neon-rs/load@0.0.4:
@@ -7813,7 +7814,7 @@ packages:
       '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0)
       '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0)
       '@octokit/types': 12.6.0
-      undici: 6.12.0
+      undici: 6.13.0
     dev: true
 
   /@octokit/auth-action@4.1.0:
@@ -7821,7 +7822,7 @@ packages:
     engines: {node: '>= 18'}
     dependencies:
       '@octokit/auth-token': 4.0.0
-      '@octokit/types': 13.1.0
+      '@octokit/types': 13.4.0
     dev: true
 
   /@octokit/auth-token@4.0.0:
@@ -7835,9 +7836,9 @@ packages:
     dependencies:
       '@octokit/auth-token': 4.0.0
       '@octokit/graphql': 7.1.0
-      '@octokit/request': 8.3.1
+      '@octokit/request': 8.4.0
       '@octokit/request-error': 5.1.0
-      '@octokit/types': 13.1.0
+      '@octokit/types': 13.4.0
       before-after-hook: 2.2.3
       universal-user-agent: 6.0.1
     dev: true
@@ -7846,7 +7847,7 @@ packages:
     resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==}
     engines: {node: '>= 18'}
     dependencies:
-      '@octokit/types': 13.1.0
+      '@octokit/types': 13.4.0
       universal-user-agent: 6.0.1
     dev: true
 
@@ -7854,8 +7855,8 @@ packages:
     resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==}
     engines: {node: '>= 18'}
     dependencies:
-      '@octokit/request': 8.3.1
-      '@octokit/types': 13.1.0
+      '@octokit/request': 8.4.0
+      '@octokit/types': 13.4.0
       universal-user-agent: 6.0.1
     dev: true
 
@@ -7863,8 +7864,8 @@ packages:
     resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==}
     dev: true
 
-  /@octokit/openapi-types@21.2.0:
-    resolution: {integrity: sha512-xx+Xd6I7rYvul/hgUDqv6TeGX0IOGnhSg9IOeYgd/uI7IAqUy6DE2B6Ipv2M4mWoxaMcWjIzgTIcv8pMO3F3vw==}
+  /@octokit/openapi-types@22.0.1:
+    resolution: {integrity: sha512-1yN5m1IMNXthoBDUXFF97N1gHop04B3H8ws7wtOr8GgRyDO1gKALjwMHARNBoMBiB/2vEe/vxstrApcJZzQbnQ==}
     dev: true
 
   /@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0):
@@ -7891,18 +7892,18 @@ packages:
     resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==}
     engines: {node: '>= 18'}
     dependencies:
-      '@octokit/types': 13.1.0
+      '@octokit/types': 13.4.0
       deprecation: 2.3.1
       once: 1.4.0
     dev: true
 
-  /@octokit/request@8.3.1:
-    resolution: {integrity: sha512-fin4cl5eHN5Ybmb/gtn7YZ+ycyUlcyqqkg5lfxeSChqj7sUt6TNaJPehREi+0PABKLREYL8pfaUhH3TicEWNoA==}
+  /@octokit/request@8.4.0:
+    resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==}
     engines: {node: '>= 18'}
     dependencies:
       '@octokit/endpoint': 9.0.5
       '@octokit/request-error': 5.1.0
-      '@octokit/types': 13.1.0
+      '@octokit/types': 13.4.0
       universal-user-agent: 6.0.1
     dev: true
 
@@ -7912,10 +7913,10 @@ packages:
       '@octokit/openapi-types': 20.0.0
     dev: true
 
-  /@octokit/types@13.1.0:
-    resolution: {integrity: sha512-nBwAFOYqVUUJ2AZFK4ZzESQptaAVqdTDKk8gE0Xr0o99WuPDSrhUC38x0F40xD9OUxXhOOuZKWNNVVLPSHQDvQ==}
+  /@octokit/types@13.4.0:
+    resolution: {integrity: sha512-WlMegy3lPXYWASe3k9Jslc5a0anrYAYMWtsFrxBTdQjS70hvLH6C+PGvHbOsgy3RA3LouGJoU/vAt4KarecQLQ==}
     dependencies:
-      '@octokit/openapi-types': 21.2.0
+      '@octokit/openapi-types': 22.0.1
     dev: true
 
   /@parse5/tools@0.3.0:
@@ -7943,7 +7944,7 @@ packages:
       playwright: 1.40.0
     dev: true
 
-  /@preact/preset-vite@2.8.2(preact@10.20.1):
+  /@preact/preset-vite@2.8.2(preact@10.20.2):
     resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==}
     peerDependencies:
       '@babel/core': 7.x
@@ -7956,7 +7957,7 @@ packages:
     dependencies:
       '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4)
       '@babel/plugin-transform-react-jsx-development': 7.22.5
-      '@prefresh/vite': 2.4.5(preact@10.20.1)
+      '@prefresh/vite': 2.4.5(preact@10.20.2)
       '@rollup/pluginutils': 4.2.1
       babel-plugin-transform-hook-names: 1.0.2
       debug: 4.3.4(supports-color@8.1.1)
@@ -7975,32 +7976,32 @@ packages:
     resolution: {integrity: sha512-O/XGxwP85h1F7+ouqTMOIZ3+V1whfaV9ToIVcuyGriD4JkSD00cQo54BKdqjvBJxbenvp7ynfqRHEwI6e+NIhw==}
     dev: false
 
-  /@preact/signals@1.2.1(preact@10.20.1):
+  /@preact/signals@1.2.1(preact@10.20.2):
     resolution: {integrity: sha512-hRPvp1C2ooDzOHqfnhdpHgoIFDbYFAXLhoid3+jSItuPPD/J0r/UsiWKv/8ZO/oEhjRaP0M5niuRYsWqmY2GEA==}
     peerDependencies:
       preact: 10.x
     dependencies:
       '@preact/signals-core': 1.6.0
-      preact: 10.20.1
+      preact: 10.20.2
     dev: false
 
   /@prefresh/babel-plugin@0.5.1:
     resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==}
     dev: false
 
-  /@prefresh/core@1.5.2(preact@10.20.1):
+  /@prefresh/core@1.5.2(preact@10.20.2):
     resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==}
     peerDependencies:
       preact: ^10.0.0
     dependencies:
-      preact: 10.20.1
+      preact: 10.20.2
     dev: false
 
   /@prefresh/utils@1.2.0:
     resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==}
     dev: false
 
-  /@prefresh/vite@2.4.5(preact@10.20.1):
+  /@prefresh/vite@2.4.5(preact@10.20.2):
     resolution: {integrity: sha512-iForDVJ2M8gQYnm5pHumvTEJjGGc7YNYC0GVKnHFL+GvFfKHfH9Rpq67nUAzNbjuLEpqEOUuQVQajMazWu2ZNQ==}
     peerDependencies:
       preact: ^10.4.0
@@ -8011,10 +8012,10 @@ packages:
     dependencies:
       '@babel/core': 7.24.4
       '@prefresh/babel-plugin': 0.5.1
-      '@prefresh/core': 1.5.2(preact@10.20.1)
+      '@prefresh/core': 1.5.2(preact@10.20.2)
       '@prefresh/utils': 1.2.0
       '@rollup/pluginutils': 4.2.1
-      preact: 10.20.1
+      preact: 10.20.2
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -8027,113 +8028,120 @@ packages:
       picomatch: 2.3.1
     dev: false
 
-  /@rollup/rollup-android-arm-eabi@4.14.1:
-    resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==}
+  /@rollup/rollup-android-arm-eabi@4.14.3:
+    resolution: {integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==}
     cpu: [arm]
     os: [android]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-android-arm64@4.14.1:
-    resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==}
+  /@rollup/rollup-android-arm64@4.14.3:
+    resolution: {integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==}
     cpu: [arm64]
     os: [android]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-darwin-arm64@4.14.1:
-    resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==}
+  /@rollup/rollup-darwin-arm64@4.14.3:
+    resolution: {integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==}
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-darwin-x64@4.14.1:
-    resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==}
+  /@rollup/rollup-darwin-x64@4.14.3:
+    resolution: {integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==}
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-arm-gnueabihf@4.14.1:
-    resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==}
+  /@rollup/rollup-linux-arm-gnueabihf@4.14.3:
+    resolution: {integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@rollup/rollup-linux-arm-musleabihf@4.14.3:
+    resolution: {integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==}
     cpu: [arm]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-arm64-gnu@4.14.1:
-    resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==}
+  /@rollup/rollup-linux-arm64-gnu@4.14.3:
+    resolution: {integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-arm64-musl@4.14.1:
-    resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==}
+  /@rollup/rollup-linux-arm64-musl@4.14.3:
+    resolution: {integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-powerpc64le-gnu@4.14.1:
-    resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==}
-    cpu: [ppc64le]
+  /@rollup/rollup-linux-powerpc64le-gnu@4.14.3:
+    resolution: {integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==}
+    cpu: [ppc64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-riscv64-gnu@4.14.1:
-    resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==}
+  /@rollup/rollup-linux-riscv64-gnu@4.14.3:
+    resolution: {integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==}
     cpu: [riscv64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-s390x-gnu@4.14.1:
-    resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==}
+  /@rollup/rollup-linux-s390x-gnu@4.14.3:
+    resolution: {integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==}
     cpu: [s390x]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-x64-gnu@4.14.1:
-    resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==}
+  /@rollup/rollup-linux-x64-gnu@4.14.3:
+    resolution: {integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-linux-x64-musl@4.14.1:
-    resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==}
+  /@rollup/rollup-linux-x64-musl@4.14.3:
+    resolution: {integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-win32-arm64-msvc@4.14.1:
-    resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==}
+  /@rollup/rollup-win32-arm64-msvc@4.14.3:
+    resolution: {integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==}
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-win32-ia32-msvc@4.14.1:
-    resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==}
+  /@rollup/rollup-win32-ia32-msvc@4.14.3:
+    resolution: {integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==}
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
     optional: true
 
-  /@rollup/rollup-win32-x64-msvc@4.14.1:
-    resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==}
+  /@rollup/rollup-win32-x64-msvc@4.14.3:
+    resolution: {integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==}
     cpu: [x64]
     os: [win32]
     requiresBuild: true
     optional: true
 
-  /@shikijs/core@1.2.4:
-    resolution: {integrity: sha512-ClaUWpt8oTzjcF0MM1P81AeWyzc1sNSJlAjMG80CbwqbFqXSNz+NpQVUC0icobt3sZn43Sn27M4pHD/Jmp3zHw==}
+  /@shikijs/core@1.3.0:
+    resolution: {integrity: sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==}
     dev: false
 
   /@sinclair/typebox@0.27.8:
@@ -8152,8 +8160,8 @@ packages:
       solid-js: 1.8.16
     dev: false
 
-  /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8):
-    resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==}
+  /@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.14)(vite@5.2.8):
+    resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==}
     engines: {node: ^18.0.0 || >=20}
     peerDependencies:
       '@sveltejs/vite-plugin-svelte': ^3.0.0
@@ -8163,16 +8171,16 @@ packages:
       vite:
         optional: true
     dependencies:
-      '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.8)
+      '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.14)(vite@5.2.8)
       debug: 4.3.4(supports-color@8.1.1)
-      svelte: 4.2.12
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+      svelte: 4.2.14
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8):
-    resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==}
+  /@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.14)(vite@5.2.8):
+    resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==}
     engines: {node: ^18.0.0 || >=20}
     peerDependencies:
       svelte: ^4.0.0 || ^5.0.0-next.0
@@ -8181,14 +8189,14 @@ packages:
       vite:
         optional: true
     dependencies:
-      '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8)
+      '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0)(svelte@4.2.14)(vite@5.2.8)
       debug: 4.3.4(supports-color@8.1.1)
       deepmerge: 4.3.1
       kleur: 4.1.5
       magic-string: 0.30.9
-      svelte: 4.2.12
-      svelte-hmr: 0.15.3(svelte@4.2.12)
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+      svelte: 4.2.14
+      svelte-hmr: 0.16.0(svelte@4.2.14)
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
       vitefu: 0.2.5(vite@5.2.8)
     transitivePeerDependencies:
       - supports-color
@@ -8258,7 +8266,7 @@ packages:
     resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/canvas-confetti@1.6.4:
@@ -8272,7 +8280,7 @@ packages:
   /@types/clean-css@4.2.11:
     resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
       source-map: 0.6.1
     dev: true
 
@@ -8283,7 +8291,7 @@ packages:
   /@types/connect@3.4.38:
     resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/cookie@0.5.4:
@@ -8326,7 +8334,7 @@ packages:
   /@types/express-serve-static-core@4.19.0:
     resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
       '@types/qs': 6.9.14
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -8413,8 +8421,8 @@ packages:
   /@types/mdurl@1.0.5:
     resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
 
-  /@types/mdx@2.0.12:
-    resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==}
+  /@types/mdx@2.0.13:
+    resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
     dev: false
 
   /@types/mime@1.3.5:
@@ -8439,7 +8447,7 @@ packages:
   /@types/needle@3.3.0:
     resolution: {integrity: sha512-UFIuc1gdyzAqeVUYpSL+cliw2MmU/ZUhVZKE7Zo4wPbgc8hbljeKSnn6ls6iG8r5jpegPXLUIhJ+Wb2kLVs8cg==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/nlcst@1.0.4:
@@ -8451,7 +8459,7 @@ packages:
   /@types/node-fetch@2.6.11:
     resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
       form-data: 4.0.0
     dev: false
 
@@ -8459,21 +8467,21 @@ packages:
     resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
     dev: true
 
-  /@types/node@16.18.95:
-    resolution: {integrity: sha512-z9w+CcR7ahc7UhsKe+PGB25nmPmCERQBAdLdFHhoZ6+FfgSr7gUvdQI0eLH2t7ue8u5wKsLdde6cHKPjhC8vGg==}
+  /@types/node@16.18.96:
+    resolution: {integrity: sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ==}
     dev: false
 
   /@types/node@17.0.45:
     resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
     dev: false
 
-  /@types/node@18.19.30:
-    resolution: {integrity: sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==}
+  /@types/node@18.19.31:
+    resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==}
     dependencies:
       undici-types: 5.26.5
 
-  /@types/node@20.12.5:
-    resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==}
+  /@types/node@20.12.7:
+    resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==}
     dependencies:
       undici-types: 5.26.5
     dev: true
@@ -8490,13 +8498,13 @@ packages:
     resolution: {integrity: sha512-HVqYj3L+D+S/6qpQRv5qMxrD/5pglzZuhP7ZIqgVSZ+Ck4z1TCFkNIRG8WesFueQTqWFTSgkkAl6f8lwxFPQSw==}
     dependencies:
       '@types/needle': 3.3.0
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/prompts@2.4.9:
     resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
       kleur: 3.0.3
     dev: true
 
@@ -8511,13 +8519,13 @@ packages:
     resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
     dev: true
 
-  /@types/react-dom@18.2.24:
-    resolution: {integrity: sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==}
+  /@types/react-dom@18.2.25:
+    resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==}
     dependencies:
-      '@types/react': 18.2.74
+      '@types/react': 18.2.78
 
-  /@types/react@18.2.74:
-    resolution: {integrity: sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==}
+  /@types/react@18.2.78:
+    resolution: {integrity: sha512-qOwdPnnitQY4xKlKayt42q5W5UQrSHjgoXNVEtxeqdITJ99k4VXJOP3vt8Rkm9HmgJpH50UNU+rlqfkfWOqp0A==}
     dependencies:
       '@types/prop-types': 15.7.12
       csstype: 3.1.3
@@ -8533,7 +8541,7 @@ packages:
   /@types/sax@1.2.7:
     resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: false
 
   /@types/semver@7.5.8:
@@ -8544,27 +8552,27 @@ packages:
     resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/serve-static@1.15.7:
     resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
       '@types/send': 0.17.4
     dev: true
 
   /@types/server-destroy@1.0.3:
     resolution: {integrity: sha512-Qq0fn70C7TLDG1W9FCblKufNWW1OckQ41dVKV2Dku5KdZF7bexezG4e2WBaBKhdwL3HZ+cYCEIKwg2BRgzrWmA==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/set-cookie-parser@2.4.7:
     resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/strip-bom@3.0.0:
@@ -8601,13 +8609,13 @@ packages:
   /@types/ws@8.5.10:
     resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: false
 
   /@types/xml2js@0.4.14:
     resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==}
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
     dev: true
 
   /@types/yargs-parser@21.0.3:
@@ -8829,7 +8837,7 @@ packages:
       '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4)
       '@types/babel__core': 7.20.5
       react-refresh: 0.14.0
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -8847,7 +8855,7 @@ packages:
       '@babel/core': 7.24.4
       '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4)
       '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.4)
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
       vue: 3.4.21(typescript@5.2.2)
     transitivePeerDependencies:
       - supports-color
@@ -8863,42 +8871,42 @@ packages:
       vite:
         optional: true
     dependencies:
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
       vue: 3.4.21(typescript@5.2.2)
     dev: false
 
-  /@vitest/expect@1.4.0:
-    resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==}
+  /@vitest/expect@1.5.0:
+    resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==}
     dependencies:
-      '@vitest/spy': 1.4.0
-      '@vitest/utils': 1.4.0
+      '@vitest/spy': 1.5.0
+      '@vitest/utils': 1.5.0
       chai: 4.4.1
     dev: false
 
-  /@vitest/runner@1.4.0:
-    resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==}
+  /@vitest/runner@1.5.0:
+    resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==}
     dependencies:
-      '@vitest/utils': 1.4.0
+      '@vitest/utils': 1.5.0
       p-limit: 5.0.0
       pathe: 1.1.2
     dev: false
 
-  /@vitest/snapshot@1.4.0:
-    resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==}
+  /@vitest/snapshot@1.5.0:
+    resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==}
     dependencies:
       magic-string: 0.30.9
       pathe: 1.1.2
       pretty-format: 29.7.0
     dev: false
 
-  /@vitest/spy@1.4.0:
-    resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==}
+  /@vitest/spy@1.5.0:
+    resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==}
     dependencies:
       tinyspy: 2.2.1
     dev: false
 
-  /@vitest/utils@1.4.0:
-    resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==}
+  /@vitest/utils@1.5.0:
+    resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==}
     dependencies:
       diff-sequences: 29.6.3
       estree-walker: 3.0.3
@@ -8919,7 +8927,7 @@ packages:
       vscode-uri: 3.0.8
     dev: true
 
-  /@volar/kit@2.1.6(typescript@5.4.4):
+  /@volar/kit@2.1.6(typescript@5.4.5):
     resolution: {integrity: sha512-dSuXChDGM0nSG/0fxqlNfadjpAeeo1P1SJPBQ+pDf8H1XrqeJq5gIhxRTEbiS+dyNIG69ATq1CArkbCif+oxJw==}
     peerDependencies:
       typescript: '*'
@@ -8927,7 +8935,7 @@ packages:
       '@volar/language-service': 2.1.6
       '@volar/typescript': 2.1.6
       typesafe-path: 0.2.2
-      typescript: 5.4.4
+      typescript: 5.4.5
       vscode-languageserver-textdocument: 1.0.11
       vscode-uri: 3.0.8
     dev: false
@@ -9350,7 +9358,7 @@ packages:
     peerDependencies:
       astro: '*'
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
       acorn: 8.11.3
       astro: link:packages/astro
     dev: false
@@ -9362,8 +9370,8 @@ packages:
     dependencies:
       '@astro-community/astro-embed-integration': 0.6.2(astro@packages+astro)
       '@astro-community/astro-embed-twitter': 0.5.4(astro@packages+astro)
-      '@astro-community/astro-embed-vimeo': 0.3.6(astro@packages+astro)
-      '@astro-community/astro-embed-youtube': 0.5.1(astro@packages+astro)
+      '@astro-community/astro-embed-vimeo': 0.3.7(astro@packages+astro)
+      '@astro-community/astro-embed-youtube': 0.5.2(astro@packages+astro)
       astro: link:packages/astro
     dev: false
 
@@ -9424,7 +9432,7 @@ packages:
       postcss: ^8.1.0
     dependencies:
       browserslist: 4.23.0
-      caniuse-lite: 1.0.30001607
+      caniuse-lite: 1.0.30001610
       fraction.js: 4.3.7
       normalize-range: 0.1.2
       picocolors: 1.0.0
@@ -9445,7 +9453,6 @@ packages:
 
   /b4a@1.6.6:
     resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==}
-    requiresBuild: true
     dev: false
 
   /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.4):
@@ -9556,7 +9563,6 @@ packages:
 
   /bl@4.1.0:
     resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
-    requiresBuild: true
     dependencies:
       buffer: 5.7.1
       inherits: 2.0.4
@@ -9640,8 +9646,8 @@ packages:
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
     dependencies:
-      caniuse-lite: 1.0.30001607
-      electron-to-chromium: 1.4.729
+      caniuse-lite: 1.0.30001610
+      electron-to-chromium: 1.4.736
       node-releases: 2.0.14
       update-browserslist-db: 1.0.13(browserslist@4.23.0)
 
@@ -9726,8 +9732,8 @@ packages:
     engines: {node: '>=14.16'}
     dev: false
 
-  /caniuse-lite@1.0.30001607:
-    resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==}
+  /caniuse-lite@1.0.30001610:
+    resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==}
 
   /canvas-confetti@1.9.2:
     resolution: {integrity: sha512-6Xi7aHHzKwxZsem4mCKoqP6YwUG3HamaHHAlz1hTNQPCqXhARFpSXnkC9TWlahHY5CG6hSL5XexNjxK8irVErg==}
@@ -9848,7 +9854,6 @@ packages:
 
   /chownr@1.1.4:
     resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
-    requiresBuild: true
     dev: false
 
   /chownr@2.0.0:
@@ -9973,11 +9978,9 @@ packages:
 
   /color-name@1.1.4:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-    requiresBuild: true
 
   /color-string@1.9.1:
     resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
-    requiresBuild: true
     dependencies:
       color-name: 1.1.4
       simple-swizzle: 0.2.2
@@ -9991,7 +9994,6 @@ packages:
   /color@4.2.3:
     resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
     engines: {node: '>=12.5.0'}
-    requiresBuild: true
     dependencies:
       color-convert: 2.0.1
       color-string: 1.9.1
@@ -10326,7 +10328,6 @@ packages:
   /decompress-response@6.0.0:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
     engines: {node: '>=10'}
-    requiresBuild: true
     dependencies:
       mimic-response: 3.1.0
     dev: false
@@ -10348,7 +10349,6 @@ packages:
   /deep-extend@0.6.0:
     resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
     engines: {node: '>=4.0.0'}
-    requiresBuild: true
     dev: false
 
   /deep-is@0.1.4:
@@ -10548,8 +10548,8 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /drizzle-orm@0.30.7(@libsql/client@0.5.6):
-    resolution: {integrity: sha512-9qefSZQlu2fO2qv24piHyWFWcxcOY15//0v4j8qomMqaxzipNoG+fUBrQ7Ftk7PY7APRbRdn/nkEXWxiI4a8mw==}
+  /drizzle-orm@0.30.8(@libsql/client@0.5.6):
+    resolution: {integrity: sha512-9pBJA0IjnpPpzZ6s9jlS1CQAbKoBmbn2GJesPhXaVblAA/joOJ4AWWevYcqvLGj9SvThBAl7WscN8Zwgg5mnTw==}
     peerDependencies:
       '@aws-sdk/client-rds-data': '>=3'
       '@cloudflare/workers-types': '>=3'
@@ -10652,8 +10652,8 @@ packages:
   /ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  /electron-to-chromium@1.4.729:
-    resolution: {integrity: sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==}
+  /electron-to-chromium@1.4.736:
+    resolution: {integrity: sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==}
 
   /emmet@2.4.7:
     resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==}
@@ -10677,7 +10677,6 @@ packages:
 
   /end-of-stream@1.4.4:
     resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
-    requiresBuild: true
     dependencies:
       once: 1.4.0
     dev: false
@@ -11125,7 +11124,6 @@ packages:
   /expand-template@2.0.3:
     resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
     engines: {node: '>=6'}
-    requiresBuild: true
     dev: false
 
   /express@4.19.2:
@@ -11200,7 +11198,6 @@ packages:
 
   /fast-fifo@1.3.2:
     resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
-    requiresBuild: true
     dev: false
 
   /fast-glob@3.3.2:
@@ -11362,7 +11359,6 @@ packages:
 
   /fs-constants@1.0.0:
     resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
-    requiresBuild: true
     dev: false
 
   /fs-extra@10.1.0:
@@ -11516,7 +11512,6 @@ packages:
 
   /github-from-package@0.0.0:
     resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
-    requiresBuild: true
     dev: false
 
   /github-slugger@2.0.0:
@@ -12099,7 +12094,6 @@ packages:
 
   /ini@1.3.8:
     resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
-    requiresBuild: true
     dev: false
 
   /inline-style-parser@0.1.1:
@@ -12147,7 +12141,6 @@ packages:
 
   /is-arrayish@0.3.2:
     resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
-    requiresBuild: true
     dev: false
 
   /is-bigint@1.0.4:
@@ -12559,21 +12552,21 @@ packages:
       type-check: 0.4.0
     dev: true
 
-  /libsql@0.3.10:
-    resolution: {integrity: sha512-/8YMTbwWFPmrDWY+YFK3kYqVPFkMgQre0DGmBaOmjogMdSe+7GHm1/q9AZ61AWkEub/vHmi+bA4tqIzVhKnqzg==}
+  /libsql@0.3.12:
+    resolution: {integrity: sha512-to30hj8O3DjS97wpbKN6ERZ8k66MN1IaOfFLR6oHqd25GMiPJ/ZX0VaZ7w+TsPmxcFS3p71qArj/hiedCyvXCg==}
     cpu: [x64, arm64, wasm32]
     os: [darwin, linux, win32]
     dependencies:
       '@neon-rs/load': 0.0.4
       detect-libc: 2.0.2
     optionalDependencies:
-      '@libsql/darwin-arm64': 0.3.10
-      '@libsql/darwin-x64': 0.3.10
-      '@libsql/linux-arm64-gnu': 0.3.10
-      '@libsql/linux-arm64-musl': 0.3.10
-      '@libsql/linux-x64-gnu': 0.3.10
-      '@libsql/linux-x64-musl': 0.3.10
-      '@libsql/win32-x64-msvc': 0.3.10
+      '@libsql/darwin-arm64': 0.3.12
+      '@libsql/darwin-x64': 0.3.12
+      '@libsql/linux-arm64-gnu': 0.3.12
+      '@libsql/linux-arm64-musl': 0.3.12
+      '@libsql/linux-x64-gnu': 0.3.12
+      '@libsql/linux-x64-musl': 0.3.12
+      '@libsql/win32-x64-msvc': 0.3.12
     dev: false
 
   /lilconfig@2.1.0:
@@ -13083,8 +13076,8 @@ packages:
     engines: {node: '>= 0.6'}
     dev: true
 
-  /memfs@4.8.1:
-    resolution: {integrity: sha512-7q/AdPzf2WpwPlPL4v1kE2KsJsHl7EF4+hAeVzlyanr2+YnR21NVn9mDqo+7DEaKDRsQy8nvxPlKH4WqMtiO0w==}
+  /memfs@4.8.2:
+    resolution: {integrity: sha512-j4WKth315edViMBGkHW6NTF0QBjsTrcRDmYNcGsPq+ozMEyCCCIlX2d2mJ5wuh6iHvJ3FevUrr48v58YRqVdYg==}
     engines: {node: '>= 4.0.0'}
     dependencies:
       tslib: 2.6.2
@@ -13508,7 +13501,6 @@ packages:
   /mimic-response@3.1.0:
     resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
     engines: {node: '>=10'}
-    requiresBuild: true
     dev: false
 
   /min-indent@1.0.1:
@@ -13589,7 +13581,6 @@ packages:
 
   /mkdirp-classic@0.5.3:
     resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
-    requiresBuild: true
     dev: false
 
   /mkdirp@1.0.4:
@@ -13687,7 +13678,6 @@ packages:
 
   /napi-build-utils@1.0.2:
     resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
-    requiresBuild: true
     dev: false
 
   /natural-compare@1.4.0:
@@ -13725,14 +13715,12 @@ packages:
   /node-abi@3.57.0:
     resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==}
     engines: {node: '>=10'}
-    requiresBuild: true
     dependencies:
       semver: 7.6.0
     dev: false
 
   /node-addon-api@6.1.0:
     resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
-    requiresBuild: true
     dev: false
 
   /node-domexception@1.0.0:
@@ -13781,7 +13769,7 @@ packages:
     engines: {node: '>=14'}
     dependencies:
       '@types/express': 4.17.21
-      '@types/node': 20.12.5
+      '@types/node': 20.12.7
       accepts: 1.3.8
       content-disposition: 0.5.4
       depd: 1.1.2
@@ -14353,8 +14341,8 @@ packages:
       postcss: 8.4.38
     dev: true
 
-  /postcss-custom-properties@13.3.6(postcss@8.4.38):
-    resolution: {integrity: sha512-vVVIwQbJiIz+PBLMIWA6XMi53Zg66/f474KolA7x0Das6EwkATc/9ZvM6zZx2gs7ZhcgVHjmWBbHkK9FlCgLeA==}
+  /postcss-custom-properties@13.3.7(postcss@8.4.38):
+    resolution: {integrity: sha512-0N9F/GUCr/D0IazjzHahyYW2bQVDT6qDtEudiGHAhMd3XqhfM3VmfYVlkc/40DOhsPtngSNb54/Ctu8msvFOvQ==}
     engines: {node: ^14 || ^16 || >=18}
     peerDependencies:
       postcss: ^8.4
@@ -14568,8 +14556,8 @@ packages:
       postcss-value-parser: 4.2.0
     dev: true
 
-  /postcss-preset-env@9.5.4(postcss@8.4.38):
-    resolution: {integrity: sha512-o/jOlJjhm4f6rI5q1f+4Og3tz1cjaO50er9ndk7ZdcXHjWOH49kMAhqDC/nQifypQkOAiAmF46dPt3pZM+Cwbg==}
+  /postcss-preset-env@9.5.5(postcss@8.4.38):
+    resolution: {integrity: sha512-tg71KfEgTHMM+C4LpWtKfHFWEunfWj1JThq/Odsw60MOowcffBrMAcSBDE+imftW5/BD3mpOiiTL6c+KcnGaLQ==}
     engines: {node: ^14 || ^16 || >=18}
     peerDependencies:
       postcss: ^8.4
@@ -14616,7 +14604,7 @@ packages:
       postcss-color-hex-alpha: 9.0.4(postcss@8.4.38)
       postcss-color-rebeccapurple: 9.0.3(postcss@8.4.38)
       postcss-custom-media: 10.0.4(postcss@8.4.38)
-      postcss-custom-properties: 13.3.6(postcss@8.4.38)
+      postcss-custom-properties: 13.3.7(postcss@8.4.38)
       postcss-custom-selectors: 7.1.8(postcss@8.4.38)
       postcss-dir-pseudo-class: 8.0.1(postcss@8.4.38)
       postcss-double-position-gradients: 5.0.6(postcss@8.4.38)
@@ -14683,31 +14671,30 @@ packages:
       picocolors: 1.0.0
       source-map-js: 1.2.0
 
-  /preact-render-to-string@6.3.1(preact@10.20.1):
+  /preact-render-to-string@6.3.1(preact@10.20.2):
     resolution: {integrity: sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==}
     peerDependencies:
       preact: '>=10'
     dependencies:
-      preact: 10.20.1
+      preact: 10.20.2
       pretty-format: 3.8.0
     dev: false
 
-  /preact-ssr-prepass@1.2.1(preact@10.20.1):
+  /preact-ssr-prepass@1.2.1(preact@10.20.2):
     resolution: {integrity: sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==}
     peerDependencies:
       preact: '>=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0'
     dependencies:
-      preact: 10.20.1
+      preact: 10.20.2
     dev: false
 
-  /preact@10.20.1:
-    resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==}
+  /preact@10.20.2:
+    resolution: {integrity: sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==}
 
   /prebuild-install@7.1.2:
     resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==}
     engines: {node: '>=10'}
     hasBin: true
-    requiresBuild: true
     dependencies:
       detect-libc: 2.0.3
       expand-template: 2.0.3
@@ -14825,7 +14812,6 @@ packages:
 
   /pump@3.0.0:
     resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
-    requiresBuild: true
     dependencies:
       end-of-stream: 1.4.4
       once: 1.4.0
@@ -14883,7 +14869,6 @@ packages:
   /rc@1.2.8:
     resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
     hasBin: true
-    requiresBuild: true
     dependencies:
       deep-extend: 0.6.0
       ini: 1.3.8
@@ -15311,28 +15296,29 @@ packages:
     dependencies:
       glob: 7.2.3
 
-  /rollup@4.14.1:
-    resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==}
+  /rollup@4.14.3:
+    resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
     dependencies:
       '@types/estree': 1.0.5
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.14.1
-      '@rollup/rollup-android-arm64': 4.14.1
-      '@rollup/rollup-darwin-arm64': 4.14.1
-      '@rollup/rollup-darwin-x64': 4.14.1
-      '@rollup/rollup-linux-arm-gnueabihf': 4.14.1
-      '@rollup/rollup-linux-arm64-gnu': 4.14.1
-      '@rollup/rollup-linux-arm64-musl': 4.14.1
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1
-      '@rollup/rollup-linux-riscv64-gnu': 4.14.1
-      '@rollup/rollup-linux-s390x-gnu': 4.14.1
-      '@rollup/rollup-linux-x64-gnu': 4.14.1
-      '@rollup/rollup-linux-x64-musl': 4.14.1
-      '@rollup/rollup-win32-arm64-msvc': 4.14.1
-      '@rollup/rollup-win32-ia32-msvc': 4.14.1
-      '@rollup/rollup-win32-x64-msvc': 4.14.1
+      '@rollup/rollup-android-arm-eabi': 4.14.3
+      '@rollup/rollup-android-arm64': 4.14.3
+      '@rollup/rollup-darwin-arm64': 4.14.3
+      '@rollup/rollup-darwin-x64': 4.14.3
+      '@rollup/rollup-linux-arm-gnueabihf': 4.14.3
+      '@rollup/rollup-linux-arm-musleabihf': 4.14.3
+      '@rollup/rollup-linux-arm64-gnu': 4.14.3
+      '@rollup/rollup-linux-arm64-musl': 4.14.3
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.14.3
+      '@rollup/rollup-linux-riscv64-gnu': 4.14.3
+      '@rollup/rollup-linux-s390x-gnu': 4.14.3
+      '@rollup/rollup-linux-x64-gnu': 4.14.3
+      '@rollup/rollup-linux-x64-musl': 4.14.3
+      '@rollup/rollup-win32-arm64-msvc': 4.14.3
+      '@rollup/rollup-win32-ia32-msvc': 4.14.3
+      '@rollup/rollup-win32-x64-msvc': 4.14.3
       fsevents: 2.3.3
 
   /rrweb-cssom@0.6.0:
@@ -15383,8 +15369,8 @@ packages:
     dependencies:
       suf-log: 2.5.3
 
-  /sass@1.74.1:
-    resolution: {integrity: sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==}
+  /sass@1.75.0:
+    resolution: {integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==}
     engines: {node: '>=14.0.0'}
     hasBin: true
     dependencies:
@@ -15625,10 +15611,10 @@ packages:
       vscode-textmate: 5.2.0
     dev: true
 
-  /shiki@1.2.4:
-    resolution: {integrity: sha512-Q9n9jKiOjJCRPztA9POn3/uZXNySHDNKAsPNpmtHDcFyi6ZQhx5vQKZW3Nhrwn8TWW3RudSRk66zqY603EZDeg==}
+  /shiki@1.3.0:
+    resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==}
     dependencies:
-      '@shikijs/core': 1.2.4
+      '@shikijs/core': 1.3.0
     dev: false
 
   /side-channel@1.0.6:
@@ -15658,12 +15644,10 @@ packages:
 
   /simple-concat@1.0.1:
     resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
-    requiresBuild: true
     dev: false
 
   /simple-get@4.0.1:
     resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
-    requiresBuild: true
     dependencies:
       decompress-response: 6.0.0
       once: 1.4.0
@@ -15687,7 +15671,6 @@ packages:
 
   /simple-swizzle@0.2.2:
     resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
-    requiresBuild: true
     dependencies:
       is-arrayish: 0.3.2
     dev: false
@@ -15853,7 +15836,6 @@ packages:
 
   /streamx@2.16.1:
     resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==}
-    requiresBuild: true
     dependencies:
       fast-fifo: 1.3.2
       queue-tick: 1.0.1
@@ -16071,16 +16053,16 @@ packages:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
 
-  /svelte-hmr@0.15.3(svelte@4.2.12):
-    resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==}
+  /svelte-hmr@0.16.0(svelte@4.2.14):
+    resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==}
     engines: {node: ^12.20 || ^14.13.1 || >= 16}
     peerDependencies:
       svelte: ^3.19.0 || ^4.0.0
     dependencies:
-      svelte: 4.2.12
+      svelte: 4.2.14
     dev: false
 
-  /svelte2tsx@0.6.27(svelte@4.2.12)(typescript@5.2.2):
+  /svelte2tsx@0.6.27(svelte@4.2.14)(typescript@5.2.2):
     resolution: {integrity: sha512-E1uPW1o6VsbRz+nUk3fznZ2lSmCITAJoNu8AYefWSvIwE2pSB01i5sId4RMbWNzfcwCQl1DcgGShCPcldl4rvg==}
     peerDependencies:
       svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0
@@ -16088,12 +16070,12 @@ packages:
     dependencies:
       dedent-js: 1.0.1
       pascal-case: 3.1.2
-      svelte: 4.2.12
+      svelte: 4.2.14
       typescript: 5.2.2
     dev: false
 
-  /svelte@4.2.12:
-    resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==}
+  /svelte@4.2.14:
+    resolution: {integrity: sha512-ry3+YlWqZpHxLy45MW4MZIxNdvB+Wl7p2nnstWKbOAewaJyNJuOtivSbRChcfIej6wFBjWqyKmf/NgK1uW2JAA==}
     engines: {node: '>=16'}
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -16178,7 +16160,6 @@ packages:
 
   /tar-fs@2.1.1:
     resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
-    requiresBuild: true
     dependencies:
       chownr: 1.1.4
       mkdirp-classic: 0.5.3
@@ -16188,7 +16169,6 @@ packages:
 
   /tar-fs@3.0.5:
     resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==}
-    requiresBuild: true
     dependencies:
       pump: 3.0.0
       tar-stream: 3.1.7
@@ -16200,7 +16180,6 @@ packages:
   /tar-stream@2.2.0:
     resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
     engines: {node: '>=6'}
-    requiresBuild: true
     dependencies:
       bl: 4.1.0
       end-of-stream: 1.4.4
@@ -16211,7 +16190,6 @@ packages:
 
   /tar-stream@3.1.7:
     resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
-    requiresBuild: true
     dependencies:
       b4a: 1.6.6
       fast-fifo: 1.3.2
@@ -16270,12 +16248,12 @@ packages:
       globrex: 0.1.2
     dev: true
 
-  /tinybench@2.6.0:
-    resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==}
+  /tinybench@2.7.0:
+    resolution: {integrity: sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==}
     dev: false
 
-  /tinypool@0.8.3:
-    resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==}
+  /tinypool@0.8.4:
+    resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
     engines: {node: '>=14.0.0'}
     dev: false
 
@@ -16411,7 +16389,6 @@ packages:
 
   /tunnel-agent@0.6.0:
     resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
-    requiresBuild: true
     dependencies:
       safe-buffer: 5.2.1
     dev: false
@@ -16601,8 +16578,8 @@ packages:
     engines: {node: '>=14.17'}
     hasBin: true
 
-  /typescript@5.4.4:
-    resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==}
+  /typescript@5.4.5:
+    resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
     engines: {node: '>=14.17'}
     hasBin: true
 
@@ -16639,8 +16616,8 @@ packages:
   /undici-types@5.26.5:
     resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
 
-  /undici@6.12.0:
-    resolution: {integrity: sha512-d87yk8lqSFUYtR5fTFe2frpkMIrUEz+lgoJmhcL+J3StVl+8fj8ytE4lLnJOTPCE12YbumNGzf4LYsQyusdV5g==}
+  /undici@6.13.0:
+    resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==}
     engines: {node: '>=18.0'}
     dev: true
 
@@ -16920,8 +16897,8 @@ packages:
       unist-util-stringify-position: 4.0.0
       vfile-message: 4.0.2
 
-  /vite-node@1.4.0(@types/node@18.19.30):
-    resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==}
+  /vite-node@1.5.0(@types/node@18.19.31):
+    resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     dependencies:
@@ -16929,7 +16906,7 @@ packages:
       debug: 4.3.4(supports-color@8.1.1)
       pathe: 1.1.2
       picocolors: 1.0.0
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -16987,7 +16964,7 @@ packages:
       svgo: 3.2.0
     dev: false
 
-  /vite@5.2.8(@types/node@18.19.30)(sass@1.74.1):
+  /vite@5.2.8(@types/node@18.19.31)(sass@1.75.0):
     resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
@@ -17015,11 +16992,11 @@ packages:
       terser:
         optional: true
     dependencies:
-      '@types/node': 18.19.30
+      '@types/node': 18.19.31
       esbuild: 0.20.2
       postcss: 8.4.38
-      rollup: 4.14.1
-      sass: 1.74.1
+      rollup: 4.14.3
+      sass: 1.75.0
     optionalDependencies:
       fsevents: 2.3.3
 
@@ -17031,18 +17008,18 @@ packages:
       vite:
         optional: true
     dependencies:
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
     dev: false
 
-  /vitest@1.4.0(@types/node@18.19.30):
-    resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==}
+  /vitest@1.5.0(@types/node@18.19.31):
+    resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     peerDependencies:
       '@edge-runtime/vm': '*'
       '@types/node': ^18.0.0 || >=20.0.0
-      '@vitest/browser': 1.4.0
-      '@vitest/ui': 1.4.0
+      '@vitest/browser': 1.5.0
+      '@vitest/ui': 1.5.0
       happy-dom: '*'
       jsdom: '*'
     peerDependenciesMeta:
@@ -17059,12 +17036,12 @@ packages:
       jsdom:
         optional: true
     dependencies:
-      '@types/node': 18.19.30
-      '@vitest/expect': 1.4.0
-      '@vitest/runner': 1.4.0
-      '@vitest/snapshot': 1.4.0
-      '@vitest/spy': 1.4.0
-      '@vitest/utils': 1.4.0
+      '@types/node': 18.19.31
+      '@vitest/expect': 1.5.0
+      '@vitest/runner': 1.5.0
+      '@vitest/snapshot': 1.5.0
+      '@vitest/spy': 1.5.0
+      '@vitest/utils': 1.5.0
       acorn-walk: 8.3.2
       chai: 4.4.1
       debug: 4.3.4(supports-color@8.1.1)
@@ -17075,10 +17052,10 @@ packages:
       picocolors: 1.0.0
       std-env: 3.7.0
       strip-literal: 2.1.0
-      tinybench: 2.6.0
-      tinypool: 0.8.3
-      vite: 5.2.8(@types/node@18.19.30)(sass@1.74.1)
-      vite-node: 1.4.0(@types/node@18.19.30)
+      tinybench: 2.7.0
+      tinypool: 0.8.4
+      vite: 5.2.8(@types/node@18.19.31)(sass@1.75.0)
+      vite-node: 1.5.0(@types/node@18.19.31)
       why-is-node-running: 2.2.2
     transitivePeerDependencies:
       - less

From b0aba11c59dac50c283ef262583f1121743497a8 Mon Sep 17 00:00:00 2001
From: Bjorn Lu 
Date: Tue, 16 Apr 2024 19:48:49 +0800
Subject: [PATCH 75/96] Improve sitemap generate performance (#10795)

---
 .changeset/famous-seals-camp.md               |   5 +
 .../sitemap/src/generate-sitemap.ts           |  94 +++++++----
 .../sitemap/src/utils/parse-i18n-url.ts       |  42 +++++
 .../sitemap/src/utils/parse-url.ts            |  39 -----
 .../test/units/generate-sitemap.test.js       | 147 ++++++++++++++++++
 5 files changed, 254 insertions(+), 73 deletions(-)
 create mode 100644 .changeset/famous-seals-camp.md
 create mode 100644 packages/integrations/sitemap/src/utils/parse-i18n-url.ts
 delete mode 100644 packages/integrations/sitemap/src/utils/parse-url.ts
 create mode 100644 packages/integrations/sitemap/test/units/generate-sitemap.test.js

diff --git a/.changeset/famous-seals-camp.md b/.changeset/famous-seals-camp.md
new file mode 100644
index 000000000000..b1703ee45ee0
--- /dev/null
+++ b/.changeset/famous-seals-camp.md
@@ -0,0 +1,5 @@
+---
+"@astrojs/sitemap": patch
+---
+
+Improves performance when generating the sitemap data
diff --git a/packages/integrations/sitemap/src/generate-sitemap.ts b/packages/integrations/sitemap/src/generate-sitemap.ts
index b10771ce481a..abd5d2c6ff49 100644
--- a/packages/integrations/sitemap/src/generate-sitemap.ts
+++ b/packages/integrations/sitemap/src/generate-sitemap.ts
@@ -1,51 +1,77 @@
 import type { EnumChangefreq } from 'sitemap';
 import type { SitemapItem, SitemapOptions } from './index.js';
-import { parseUrl } from './utils/parse-url.js';
+import { parseI18nUrl } from './utils/parse-i18n-url.js';
 
 /** Construct sitemap.xml given a set of URLs */
-export function generateSitemap(pages: string[], finalSiteUrl: string, opts: SitemapOptions) {
-	const { changefreq, priority, lastmod: lastmodSrc, i18n } = opts!;
+export function generateSitemap(pages: string[], finalSiteUrl: string, opts?: SitemapOptions) {
+	const { changefreq, priority, lastmod: lastmodSrc, i18n } = opts ?? {};
 	// TODO: find way to respect  URLs here
 	const urls = [...pages];
 	urls.sort((a, b) => a.localeCompare(b, 'en', { numeric: true })); // sort alphabetically so sitemap is same each time
 
 	const lastmod = lastmodSrc?.toISOString();
 
-	const { locales, defaultLocale } = i18n || {};
-	const localeCodes = Object.keys(locales || {});
+	// Parse URLs for i18n matching later
+	const { defaultLocale, locales } = i18n ?? {};
+	let getI18nLinks: GetI18nLinks | undefined;
+	if (defaultLocale && locales) {
+		getI18nLinks = createGetI18nLinks(urls, defaultLocale, locales, finalSiteUrl);
+	}
 
-	const getPath = (url: string) => {
-		const result = parseUrl(url, i18n?.defaultLocale || '', localeCodes, finalSiteUrl);
-		return result?.path;
-	};
-	const getLocale = (url: string) => {
-		const result = parseUrl(url, i18n?.defaultLocale || '', localeCodes, finalSiteUrl);
-		return result?.locale;
-	};
+	const urlData: SitemapItem[] = urls.map((url, i) => ({
+		url,
+		links: getI18nLinks?.(i),
+		lastmod,
+		priority,
+		changefreq: changefreq as EnumChangefreq,
+	}));
+
+	return urlData;
+}
+
+type GetI18nLinks = (urlIndex: number) => SitemapItem['links'] | undefined;
+
+function createGetI18nLinks(
+	urls: string[],
+	defaultLocale: string,
+	locales: Record,
+	finalSiteUrl: string
+): GetI18nLinks {
+	// `parsedI18nUrls` will have the same length as `urls`, matching correspondingly
+	const parsedI18nUrls = urls.map((url) => parseI18nUrl(url, defaultLocale, locales, finalSiteUrl));
+	// Cache as multiple i18n URLs with the same path will have the same links
+	const i18nPathToLinksCache = new Map();
 
-	const urlData: SitemapItem[] = urls.map((url) => {
-		let links;
-		if (defaultLocale && locales) {
-			const currentPath = getPath(url);
-			if (currentPath) {
-				const filtered = urls.filter((subUrl) => getPath(subUrl) === currentPath);
-				if (filtered.length > 1) {
-					links = filtered.map((subUrl) => ({
-						url: subUrl,
-						lang: locales[getLocale(subUrl)!],
-					}));
-				}
+	return (urlIndex) => {
+		const i18nUrl = parsedI18nUrls[urlIndex];
+		if (!i18nUrl) {
+			return undefined;
+		}
+
+		const cached = i18nPathToLinksCache.get(i18nUrl.path);
+		if (cached) {
+			return cached;
+		}
+
+		// Find all URLs with the same path (without the locale part), e.g. /en/foo and /es/foo
+		const links: NonNullable = [];
+		for (let i = 0; i < parsedI18nUrls.length; i++) {
+			const parsed = parsedI18nUrls[i];
+			if (parsed?.path === i18nUrl.path) {
+				links.push({
+					url: urls[i],
+					lang: locales[parsed.locale],
+				});
 			}
 		}
 
-		return {
-			url,
-			links,
-			lastmod,
-			priority,
-			changefreq: changefreq as EnumChangefreq,
-		};
-	});
+		// If 0 or 1 (which is itself), return undefined to not create any links.
+		// We also don't need to cache this as we know there's no other URLs that would've match this.
+		if (links.length <= 1) {
+			return undefined;
+		}
 
-	return urlData;
+		i18nPathToLinksCache.set(i18nUrl.path, links);
+		return links;
+	};
 }
diff --git a/packages/integrations/sitemap/src/utils/parse-i18n-url.ts b/packages/integrations/sitemap/src/utils/parse-i18n-url.ts
new file mode 100644
index 000000000000..5b7ebf78550d
--- /dev/null
+++ b/packages/integrations/sitemap/src/utils/parse-i18n-url.ts
@@ -0,0 +1,42 @@
+interface ParsedI18nUrl {
+	locale: string;
+	path: string;
+}
+
+// NOTE: The parameters have been schema-validated with Zod
+export function parseI18nUrl(
+	url: string,
+	defaultLocale: string,
+	locales: Record,
+	base: string
+): ParsedI18nUrl | undefined {
+	if (!url.startsWith(base)) {
+		return undefined;
+	}
+
+	let s = url.slice(base.length);
+
+	// Handle root URL
+	if (!s || s === '/') {
+		return { locale: defaultLocale, path: '/' };
+	}
+
+	if (s[0] !== '/') {
+		s = '/' + s;
+	}
+
+	// Get locale from path, e.g.
+	// "/en-US/" -> "en-US"
+	// "/en-US/foo" -> "en-US"
+	const locale = s.split('/')[1];
+	if (locale in locales) {
+		// "/en-US/foo" -> "/foo"
+		let path = s.slice(1 + locale.length);
+		if (!path) {
+			path = '/';
+		}
+		return { locale, path };
+	}
+
+	return { locale: defaultLocale, path: s };
+}
diff --git a/packages/integrations/sitemap/src/utils/parse-url.ts b/packages/integrations/sitemap/src/utils/parse-url.ts
deleted file mode 100644
index f9189cf7d60d..000000000000
--- a/packages/integrations/sitemap/src/utils/parse-url.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-export const parseUrl = (
-	url: string,
-	defaultLocale: string,
-	localeCodes: string[],
-	base: string
-) => {
-	if (
-		!url ||
-		!defaultLocale ||
-		localeCodes.length === 0 ||
-		localeCodes.some((key) => !key) ||
-		!base
-	) {
-		throw new Error('parseUrl: some parameters are empty');
-	}
-	if (url.indexOf(base) !== 0) {
-		return undefined;
-	}
-	let s = url.replace(base, '');
-	if (!s || s === '/') {
-		return { locale: defaultLocale, path: '/' };
-	}
-	if (!s.startsWith('/')) {
-		s = '/' + s;
-	}
-	const a = s.split('/');
-	const locale = a[1];
-	if (localeCodes.some((key) => key === locale)) {
-		let path = a.slice(2).join('/');
-		if (path === '//') {
-			path = '/';
-		}
-		if (path !== '/' && !path.startsWith('/')) {
-			path = '/' + path;
-		}
-		return { locale, path };
-	}
-	return { locale: defaultLocale, path: s };
-};
diff --git a/packages/integrations/sitemap/test/units/generate-sitemap.test.js b/packages/integrations/sitemap/test/units/generate-sitemap.test.js
new file mode 100644
index 000000000000..2af0e42ab8a4
--- /dev/null
+++ b/packages/integrations/sitemap/test/units/generate-sitemap.test.js
@@ -0,0 +1,147 @@
+import assert from 'node:assert/strict';
+import { describe, it } from 'node:test';
+import { generateSitemap } from '../../dist/generate-sitemap.js';
+
+const site = 'http://example.com';
+
+describe('generateSitemap', () => {
+	describe('basic', () => {
+		it('works', () => {
+			const items = generateSitemap(
+				[
+					// All pages
+					`${site}/a`,
+					`${site}/b`,
+					`${site}/c`,
+				],
+				site
+			);
+			assert.equal(items.length, 3);
+			assert.equal(items[0].url, `${site}/a`);
+			assert.equal(items[1].url, `${site}/b`);
+			assert.equal(items[2].url, `${site}/c`);
+		});
+
+		it('sorts the items', () => {
+			const items = generateSitemap(
+				[
+					// All pages
+					`${site}/c`,
+					`${site}/a`,
+					`${site}/b`,
+				],
+				site
+			);
+			assert.equal(items.length, 3);
+			assert.equal(items[0].url, `${site}/a`);
+			assert.equal(items[1].url, `${site}/b`);
+			assert.equal(items[2].url, `${site}/c`);
+		});
+
+		it('sitemap props are passed to items', () => {
+			const now = new Date();
+			const items = generateSitemap(
+				[
+					// All pages
+					`${site}/a`,
+					`${site}/b`,
+					`${site}/c`,
+				],
+				site,
+				{
+					changefreq: 'monthly',
+					lastmod: now,
+					priority: 0.5,
+				}
+			);
+
+			assert.equal(items.length, 3);
+
+			assert.equal(items[0].url, `${site}/a`);
+			assert.equal(items[0].changefreq, 'monthly');
+			assert.equal(items[0].lastmod, now.toISOString());
+			assert.equal(items[0].priority, 0.5);
+
+			assert.equal(items[1].url, `${site}/b`);
+			assert.equal(items[1].changefreq, 'monthly');
+			assert.equal(items[1].lastmod, now.toISOString());
+			assert.equal(items[1].priority, 0.5);
+
+			assert.equal(items[2].url, `${site}/c`);
+			assert.equal(items[2].changefreq, 'monthly');
+			assert.equal(items[2].lastmod, now.toISOString());
+			assert.equal(items[2].priority, 0.5);
+		});
+	});
+
+	describe('i18n', () => {
+		it('works', () => {
+			const items = generateSitemap(
+				[
+					// All pages
+					`${site}/a`,
+					`${site}/b`,
+					`${site}/c`,
+					`${site}/es/a`,
+					`${site}/es/b`,
+					`${site}/es/c`,
+					`${site}/fr/a`,
+					`${site}/fr/b`,
+					// `${site}/fr-CA/c`, (intentionally missing for testing)
+				],
+				site,
+				{
+					i18n: {
+						defaultLocale: 'en',
+						locales: {
+							en: 'en-US',
+							es: 'es-ES',
+							fr: 'fr-CA',
+						},
+					},
+				}
+			);
+
+			assert.equal(items.length, 8);
+
+			const aLinks = [
+				{ url: `${site}/a`, lang: 'en-US' },
+				{ url: `${site}/es/a`, lang: 'es-ES' },
+				{ url: `${site}/fr/a`, lang: 'fr-CA' },
+			];
+			const bLinks = [
+				{ url: `${site}/b`, lang: 'en-US' },
+				{ url: `${site}/es/b`, lang: 'es-ES' },
+				{ url: `${site}/fr/b`, lang: 'fr-CA' },
+			];
+			const cLinks = [
+				{ url: `${site}/c`, lang: 'en-US' },
+				{ url: `${site}/es/c`, lang: 'es-ES' },
+			];
+
+			assert.equal(items[0].url, `${site}/a`);
+			assert.deepEqual(items[0].links, aLinks);
+
+			assert.equal(items[1].url, `${site}/b`);
+			assert.deepEqual(items[1].links, bLinks);
+
+			assert.equal(items[2].url, `${site}/c`);
+			assert.deepEqual(items[2].links, cLinks);
+
+			assert.equal(items[3].url, `${site}/es/a`);
+			assert.deepEqual(items[3].links, aLinks);
+
+			assert.equal(items[4].url, `${site}/es/b`);
+			assert.deepEqual(items[4].links, bLinks);
+
+			assert.equal(items[5].url, `${site}/es/c`);
+			assert.deepEqual(items[5].links, cLinks);
+
+			assert.equal(items[6].url, `${site}/fr/a`);
+			assert.deepEqual(items[6].links, aLinks);
+
+			assert.equal(items[7].url, `${site}/fr/b`);
+			assert.deepEqual(items[7].links, bLinks);
+		});
+	});
+});

From 26ca2fde09cf3a2ff115247485129554dfd17f40 Mon Sep 17 00:00:00 2001
From: Bjorn Lu 
Date: Tue, 16 Apr 2024 21:21:19 +0800
Subject: [PATCH 76/96] Disable streaming for SSG (#10796)

---
 .changeset/eight-hotels-try.md                           | 5 +++++
 packages/astro/src/core/build/pipeline.ts                | 3 ++-
 packages/astro/src/runtime/server/render/astro/render.ts | 4 ++++
 packages/astro/test/content-collections-render.test.js   | 6 +-----
 4 files changed, 12 insertions(+), 6 deletions(-)
 create mode 100644 .changeset/eight-hotels-try.md

diff --git a/.changeset/eight-hotels-try.md b/.changeset/eight-hotels-try.md
new file mode 100644
index 000000000000..f1fab2897d1f
--- /dev/null
+++ b/.changeset/eight-hotels-try.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Disables streaming when rendering site with `output: "static"`
diff --git a/packages/astro/src/core/build/pipeline.ts b/packages/astro/src/core/build/pipeline.ts
index a89aa10f071c..245904660c18 100644
--- a/packages/astro/src/core/build/pipeline.ts
+++ b/packages/astro/src/core/build/pipeline.ts
@@ -53,7 +53,8 @@ export class BuildPipeline extends Pipeline {
 			return assetLink;
 		}
 		const serverLike = isServerLikeOutput(config);
-		const streaming = true;
+		// We can skip streaming in SSG for performance as writing as strings are faster
+		const streaming = serverLike;
 		super(
 			options.logger,
 			manifest,
diff --git a/packages/astro/src/runtime/server/render/astro/render.ts b/packages/astro/src/runtime/server/render/astro/render.ts
index 37a78725a092..f918f55c11dc 100644
--- a/packages/astro/src/runtime/server/render/astro/render.ts
+++ b/packages/astro/src/runtime/server/render/astro/render.ts
@@ -31,6 +31,10 @@ export async function renderToString(
 	let str = '';
 	let renderedFirstPageChunk = false;
 
+	if (isPage) {
+		await bufferHeadContent(result);
+	}
+
 	const destination: RenderDestination = {
 		write(chunk) {
 			// Automatic doctype insertion for pages
diff --git a/packages/astro/test/content-collections-render.test.js b/packages/astro/test/content-collections-render.test.js
index 0e8e37fb176b..277ef8c06956 100644
--- a/packages/astro/test/content-collections-render.test.js
+++ b/packages/astro/test/content-collections-render.test.js
@@ -2,11 +2,7 @@ import * as assert from 'node:assert/strict';
 import { after, before, describe, it } from 'node:test';
 import * as cheerio from 'cheerio';
 import testAdapter from './test-adapter.js';
-import { isWindows, loadFixture } from './test-utils.js';
-
-if (!isWindows) {
-	describe();
-}
+import { loadFixture } from './test-utils.js';
 
 describe('Content Collections - render()', () => {
 	describe('Build - SSG', () => {

From 26e02621ac9de6be8027cdf6eb500d04386ab6a9 Mon Sep 17 00:00:00 2001
From: Rishi Raj Jain 
Date: Tue, 16 Apr 2024 18:53:50 +0530
Subject: [PATCH 77/96] fix: use assetsDir in creating vite config (#10732)

Co-authored-by: Emanuele Stoppa 
---
 .changeset/afraid-laws-speak.md               |   5 +++
 packages/astro/src/core/create-vite.ts        |   1 +
 packages/astro/test/astro-assets-dir.test.js  |  36 ++++++++++++++++++
 .../astro-assets-dir/astro.config.mjs         |   7 ++++
 .../fixtures/astro-assets-dir/package.json    |  11 ++++++
 .../astro-assets-dir/src/assets/penguin1.jpg  | Bin 0 -> 11621 bytes
 ...2\343\203\263\343\202\256\343\203\263.jpg" | Bin 0 -> 11621 bytes
 .../src/components/Counter.jsx                |  11 ++++++
 .../src/content/blog/my-post.md               |   6 +++
 .../astro-assets-dir/src/content/config.ts    |  12 ++++++
 .../astro-assets-dir/src/pages/blog.astro     |  16 ++++++++
 .../astro-assets-dir/src/pages/index.astro    |  23 +++++++++++
 .../astro-assets-dir/src/pages/markdown.md    |   7 ++++
 pnpm-lock.yaml                                |  15 ++++++++
 14 files changed, 150 insertions(+)
 create mode 100644 .changeset/afraid-laws-speak.md
 create mode 100644 packages/astro/test/astro-assets-dir.test.js
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/package.json
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/assets/penguin1.jpg
 create mode 100644 "packages/astro/test/fixtures/astro-assets-dir/src/assets/\343\203\232\343\203\263\343\202\256\343\203\263.jpg"
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/components/Counter.jsx
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro
 create mode 100644 packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md

diff --git a/.changeset/afraid-laws-speak.md b/.changeset/afraid-laws-speak.md
new file mode 100644
index 000000000000..62e4a8bd6f04
--- /dev/null
+++ b/.changeset/afraid-laws-speak.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Correctly sets `build.assets` directory during `vite` config setup
diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts
index cc32fb6f165d..a1771ad8cbce 100644
--- a/packages/astro/src/core/create-vite.ts
+++ b/packages/astro/src/core/create-vite.ts
@@ -208,6 +208,7 @@ export async function createVite(
 			noExternal: [...ALWAYS_NOEXTERNAL, ...astroPkgsConfig.ssr.noExternal],
 			external: [...(mode === 'dev' ? ONLY_DEV_EXTERNAL : []), ...astroPkgsConfig.ssr.external],
 		},
+		build: { assetsDir: settings.config.build.assets },
 	};
 
 	// If the user provides a custom assets prefix, make sure assets handled by Vite
diff --git a/packages/astro/test/astro-assets-dir.test.js b/packages/astro/test/astro-assets-dir.test.js
new file mode 100644
index 000000000000..453248987aab
--- /dev/null
+++ b/packages/astro/test/astro-assets-dir.test.js
@@ -0,0 +1,36 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('assets dir takes the URL path inside the output directory', () => {
+	/** @type {URL} */
+	let checkDir;
+	before(async () => {
+		const fixture = await loadFixture({
+			root: './fixtures/astro-assets-dir/',
+			build: {
+				assets: 'custom_dir_1',
+			},
+			integrations: [
+				{
+					name: '@astrojs/dir',
+					hooks: {
+						'astro:build:done': ({ dir }) => {
+							checkDir = dir;
+						},
+					},
+				},
+			],
+		});
+		await fixture.build();
+	});
+	it('generates the assets directory as per build.assets configuration', async () => {
+		const removeTrailingSlash = (str) => str.replace(/\/$/, '');
+		assert.equal(
+			removeTrailingSlash(new URL('./custom_dir_1', checkDir).toString()),
+			removeTrailingSlash(
+				new URL('./fixtures/astro-assets-dir/dist/custom_dir_1', import.meta.url).toString()
+			)
+		);
+	});
+});
diff --git a/packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs b/packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs
new file mode 100644
index 000000000000..e7ce274c003a
--- /dev/null
+++ b/packages/astro/test/fixtures/astro-assets-dir/astro.config.mjs
@@ -0,0 +1,7 @@
+import react from '@astrojs/react';
+import { defineConfig } from 'astro/config';
+
+// https://astro.build/config
+export default defineConfig({
+	integrations: [react()],
+});
diff --git a/packages/astro/test/fixtures/astro-assets-dir/package.json b/packages/astro/test/fixtures/astro-assets-dir/package.json
new file mode 100644
index 000000000000..e4c2518a59b6
--- /dev/null
+++ b/packages/astro/test/fixtures/astro-assets-dir/package.json
@@ -0,0 +1,11 @@
+{
+  "name": "@test/astro-assets-dir",
+  "version": "0.0.0",
+  "private": true,
+  "dependencies": {
+    "@astrojs/react": "workspace:*",
+    "astro": "workspace:*",
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0"
+  }
+}
diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/assets/penguin1.jpg b/packages/astro/test/fixtures/astro-assets-dir/src/assets/penguin1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1a8986ac50923dbb9b36ad43e1af1415928ea912
GIT binary patch
literal 11621
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
+      
Count: {count}
+ + + ); +} diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md b/packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md new file mode 100644 index 000000000000..82c1bbb8622b --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/content/blog/my-post.md @@ -0,0 +1,6 @@ +--- +title: My Post +cover: ../../assets/penguin1.jpg +--- + +Hello world diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts b/packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts new file mode 100644 index 000000000000..185048665589 --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/content/config.ts @@ -0,0 +1,12 @@ +import { defineCollection, z } from "astro:content"; + +const blogCollection = defineCollection({ + schema: ({image}) => z.object({ + title: z.string(), + cover: image(), + }), +}); + +export const collections = { + blog: blogCollection, +}; diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro b/packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro new file mode 100644 index 000000000000..13729ec0abbc --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/pages/blog.astro @@ -0,0 +1,16 @@ +--- +import { Image } from "astro:assets"; +import { getCollection } from "astro:content"; +const allBlogPosts = await getCollection("blog"); +--- + +{ + allBlogPosts.map((post) => ( +
+ )) +} diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro b/packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro new file mode 100644 index 000000000000..4158153205f4 --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/pages/index.astro @@ -0,0 +1,23 @@ +--- +import { Image } from 'astro:assets' +import p1Image from '../assets/penguin1.jpg'; +import Counter from '../components/Counter.jsx'; +--- + + + + Assets Prefix + + +

I am red

+ penguin + penguin + +

{typeof import.meta.env.ASSETS_PREFIX === 'string' ? import.meta.env.ASSETS_PREFIX : JSON.stringify(import.meta.env.ASSETS_PREFIX)}

+ + + diff --git a/packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md b/packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md new file mode 100644 index 000000000000..06c4f7fcfdbb --- /dev/null +++ b/packages/astro/test/fixtures/astro-assets-dir/src/pages/markdown.md @@ -0,0 +1,7 @@ +# Assets Prefix + +Relative image has assetsPrefix + +![Relative image](../assets/penguin1.jpg) + +![non-UTF-8 file name image](../assets/ペンギン.jpg) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7981235d2cf9..336e24512a8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1800,6 +1800,21 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/astro-assets-dir: + dependencies: + '@astrojs/react': + specifier: workspace:* + version: link:../../../../integrations/react + astro: + specifier: workspace:* + version: link:../../.. + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + packages/astro/test/fixtures/astro-assets-prefix: dependencies: '@astrojs/react': From f174cdfc338975d39057635fbe66767cfcd09d29 Mon Sep 17 00:00:00 2001 From: Rishi Raj Jain Date: Tue, 16 Apr 2024 19:43:52 +0530 Subject: [PATCH 78/96] fix: MDX cannot find relative image path without leading ./ (#10754) Co-authored-by: Oliver Speir <115520730+OliverSpeir@users.noreply.github.com> --- .changeset/curly-badgers-boil.md | 16 ++++++++++++++++ packages/integrations/mdx/src/index.ts | 7 +++++++ .../mdx/src/remark-images-to-component.ts | 7 +++++-- .../fixtures/mdx-images/src/pages/houston.png | Bin 0 -> 160915 bytes .../fixtures/mdx-images/src/pages/index.mdx | 6 ++++++ .../mdx-images/src/pages/relative/houston.png | Bin 0 -> 160915 bytes .../integrations/mdx/test/mdx-images.test.js | 6 +++++- 7 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 .changeset/curly-badgers-boil.md create mode 100644 packages/integrations/mdx/test/fixtures/mdx-images/src/pages/houston.png create mode 100644 packages/integrations/mdx/test/fixtures/mdx-images/src/pages/relative/houston.png diff --git a/.changeset/curly-badgers-boil.md b/.changeset/curly-badgers-boil.md new file mode 100644 index 000000000000..f7fc51ecb9c9 --- /dev/null +++ b/.changeset/curly-badgers-boil.md @@ -0,0 +1,16 @@ +--- +"@astrojs/mdx": patch +--- + +Fixes an issue where images in MDX required a relative specifier (e.g. `./`) + +Now, you can use the standard `![](img.png)` syntax in MDX files for images colocated in the same folder: no relative specifier required! + +There is no need to update your project; your existing images will still continue to work. However, you may wish to remove any relative specifiers from these MDX images as they are no longer necessary: + +```diff +- ![A cute dog](./dog.jpg) ++ ![A cute dog](dog.jpg) + +``` + diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index bdf1c90627f2..db7f6413451f 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -106,6 +106,13 @@ export default function mdx(partialMdxOptions: Partial = {}): AstroI } } }, + async resolveId(source, importer, options) { + if (importer?.endsWith('.mdx') && source[0] !== '/') { + let resolved = await this.resolve(source, importer, options); + if (!resolved) resolved = await this.resolve('./' + source, importer, options); + return resolved; + } + }, // Override transform to alter code before MDX compilation // ex. inject layouts async transform(_, id) { diff --git a/packages/integrations/mdx/src/remark-images-to-component.ts b/packages/integrations/mdx/src/remark-images-to-component.ts index 4ab6a0422e90..46d04d443341 100644 --- a/packages/integrations/mdx/src/remark-images-to-component.ts +++ b/packages/integrations/mdx/src/remark-images-to-component.ts @@ -24,7 +24,6 @@ export function remarkImageToComponent() { // If we haven't already imported this image, add an import statement if (!importName) { importName = `__${importedImages.size}_${node.url.replace(/\W/g, '_')}__`; - importsStatements.push({ type: 'mdxjsEsm', value: '', @@ -35,7 +34,11 @@ export function remarkImageToComponent() { body: [ { type: 'ImportDeclaration', - source: { type: 'Literal', value: node.url, raw: JSON.stringify(node.url) }, + source: { + type: 'Literal', + value: node.url, + raw: JSON.stringify(node.url), + }, specifiers: [ { type: 'ImportDefaultSpecifier', diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/houston.png b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/houston.png new file mode 100644 index 0000000000000000000000000000000000000000..345ed0e9de1ee119bc74a70cd12d573dacbf89d8 GIT binary patch literal 160915 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 z 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�X3sZS$g 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 + +Image using a relative path with no slashes: +![Houston](houston.png) + +Image using a relative path with nested directory: +![Houston](relative/houston.png) diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/relative/houston.png b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/relative/houston.png new file mode 100644 index 0000000000000000000000000000000000000000..345ed0e9de1ee119bc74a70cd12d573dacbf89d8 GIT binary patch literal 160915 zcmZU)19T-_(>5GClVrjZ+qN;WZ9AEm6HaW~oQZAQwylY6e`oIddEe(<|9{rny?0k# zSMAzW)xEm+>Jz3QCyoe*4F>`Of+#5=q67j0WNx(@>dl*CH1JcEEB2wDmYD@Y0p z6Dl~`nORz!f`CYbC8 z8Sot>mS!}iAL^B5ki3XdVgm%4avGA`cktjKOmk*t2PC=Y;qqVu(RX;Y>+&%@_Z z{s`v&HHct7k=)+lwIdNf2#DSQs`L#g;i%hf$+Hn47~MkJz!#YzaR&jiGJb~@a+9Pf zEXGuL9nLo#JB4NhMDU$?9{|~oP@K03U6T;XfCegPEO?fX!IOsMK;6$iErw7dlauxk zAUC+hIv32^vK~oPo*L0!3;}c7&$WL1Y0mxeV`L)k%S*MtDxLDzuQVAf<7*XXBZkc7 zP!3g;bj)x@bfE$;&yJpm-@E)Q;h8BvPt1r9N=gi63ch?*-Gdx|L44CeiE@ zUs62`&Ah($qlMDJ1%|~TmkFPxrr==~)&rDNN1}1-<0OntueAknX^pmR{uV3U9!DdVKjX^tC z_2|ndpTO`>bB$P7b>>;27=+baGNxE8K?EWw6dMQdb?C?5zMTamHS^3cPlU<6HohII zynw4v`>binWD6^m*rjcL%%TFG&u%>mZ!l^wUW2k3reG zL}O}$bYpOP6z5$N+aU`It8rPwl5G%`R z6Wrw*`$g6k6M;6Z9HBX;la$;Cc4 z1fAD9oo+utx?i8VySsNTb&ecB9$Nc`KBs?72Ez*Am4amQ^e0Hcq2bcEA#ZE@L*=k~ z8z7APA!f#~*n{hJBSH8pAVcm7F{i@(nhJc?0W0)RGr*?=H8lWeKrZ@48Ne@tx(0aX zqTqs3^Z@KpbfA`cbela}yWyvyH~pqy{9}=+zlqQ5zj;+-wl8u-jSe204PP53$v534eRYAJAUPgaVBhv3z0y&!F~=jD#k92!p>7Wl1L1zon~ak z&+;|PRi6G34)q#7m8*lr|mmXAme16EBD2BnM9iA(wcJ!`rf&SMkI|%BY zSOfVhQhOLxm3!u!b%5~L)oB-33+Zl}6Vq#flQ#g@W5U_HP;h$<~D zO)Cxg9$Bj3Qh9>Cz*l;xLQwisWlpJ1*|;o9J)x9Najnwz+j-+E4t3IZ(feP83b!TF z#ccD+^U(81C(bV7F45fj-q9Wf9sw`t_bIH*6Y+!jvcJ)1sV!bDQ!F~LO%Q1i8==&V z8^sC+iJ~&F-_xBZ6w?*cThb%getgefI$I>R)U<^Be%%n>&}fl0>mf6A^v9V!OFTz@ zOG-fYa+dtNwv|(TUHw@75344t$774*<|EP*nYogAuF|=Zh-0l|M`tJJl#`3Oj=WdP z)EUM_#-3`?zLQ{Gz=NJ$b9PR)V3kUh-ev11g?I4J+@Fmfj_+dcuTaf?SwfLLDglU4 zMTj0DR!EQ7lQ??ZURzf@!Nqx5hUGg5eRRP#!S7;&Vm)F;zZ%4fB0Zv9qTVCxBGs`8 zST30IGM-XlWYyAfIov0w4Xd%ZBH1F<#BxgVEJI7?o$D;yj?G!D>LBWf>pbdS|DZV) zy0<<{-D2GG!=pyPM5JLfVEmvRNtPLt8Cys;r`yuj)F#uUtNvbp(zsanM*~x9No%Vv zZ}n+arlzE^#Z0>1bk%IFvZ=#5WVL10bX9d#w^sao<1Fam^qfZwSOJe(#ZO5^s3+$cN?uLQ;vW&Kj{))+pp^aX?g^tm8a^(!b zgw8ncq0rUUW9ptm|K6{n4D-%I{;95Z-1gcIR}Yt%8hjG0I+t-{I~KdjN3%;gf?)a5 zDe@dSeP#VhyM{{=0VjdZE%q*RT5UB9E6me^u7s}s&)iSXMhZ`iR}l~lWLyR8Y5ZdJ zRODv*E1_6T1u+F11^sHPtH^CsqQKbd*aIRCE-_sEqTo5q6MSx(dNvt4T6$~U}?Lb4lzV^Wf&w7%34VNCX1FYm-Na(i&e><=W^X&)-+}y$03DJ$WW4?3Zq(6dKrR@ z)@G};YCnC7zvdvuDSW`_<%c`<3S#D0R)oN{Zl6^`qY{0Nesd%rYciOm@`W$_s z?kg2ly+-b()O!iu%pndXlJsZ!J?wR(R}GiH{}QPnQf_4@tRJRwtge@S=@ztCx^>r zl(*rl)&tAq5?(d0f=ler>UvPi)XnLo)RpCx#PxXx$~y(=I`!M0zUYu90wz8sca_7V zS>r_Gfgz}9O#Dj$BK{dq=Dq#BWJ$Uo@=<&)6>NnK@6OA|PUilTncQRCo^P3tEhLA0 zQv|Ku?bB{E=SIRAR%<<5x;_HS7mJ(rBkxLcrZHm^c*fk(y4M|!H{ZJ#Se7`K==EaS zHyucJ1}if5>|8f@w@x~OGR%y%l-MoNVvxm!Lb- z3H7zAiLKtw4V+;-EMzA#o#!eLD4O)_FWsl-APNbfxqY_))6CsB3Wm_#acc2x0mA`+ zqTV`4alq##Q^(ciA94`S#@;>5`JyOj!gM&nc4$HI82r)zbGGLeCAH8i+-j;DD=k~> zCk|1EKW{`AIogEEE}#NUpJ2|kUQz_IN5Gd0kZ@BCNi$hl5NhBU1_S~W8w3(K0tGgH zP@MlAi-A&tfd3;00|5!K1cCSuMh@8j{lx;?U(UZhcziGjH1O;zu({=e{SO+S!9s86 zXwJaI#l^+I$jrdZOb0~JIl0?98@kciI+6TqUFee`m6F`p>d}3uO4KVPK+XWcXj(Kq~KFDYt^9o2j*?h@}lMX23c4 zSvgsG|H1$NH2*7h3#yBQ#$kiH(mcB|6k>Qh`bDc zSN?w@@o$*_kpkn)568>!zd7TF`;_lj2c{9%Qbb+_*aM5~pWhAeNC|9zdtiGE@}3>- z009vMkrWY9aRWW;Fi#+pbS1+mVJWLMQ7=2juVDf2Fb;-<1s@+Sn0ZjYg|`$_z`|_n zUIoKCGa?jol^-jmPfFr;pKST5Bif#FX{rXd9H}na{JQXSgJicbL?9-KLOweaQG$ks zrtf6+#op1Y|3v9{v+u`18`>PgE=N^1QV6ssqN}&D6(>Kpg+YW$qwB?&wI3G@-#q9i zuCI5lUY?f_@!nlrUAZ%}ve~b0sqgOJhX^vo8yP6&ev;$McAfh?B7vRUV=CWwRao;ZcwM4D($2W~1Y?InHGU?oyK> z`{!o0)!S~TbKJGh=k=@G&vNz~daWI-)609zd%)1g;^c*>tmTuN?9FQV9QS1ng}58k z5sKEYKgsG#i@}~qTN%=I2sZu{GQ*Cc4Z3{ys8q9bavQ?{M>MmFm1=eGlUS1L+j z!NH96{9|q~=2geI+_O?}=2e%t&VQ6lgnI#&$Jagspev%@gCR4jP$u=#LID4~g27KV z2oucv6;)`HS}Rl^1AO{NX!5GGGK67^6nv?^8==1%%=59bFT=g`AATc}kpls>r!d1N zYmol6Kq38ViaK8GOl7J8m#}@Cj)JQxC?KkJSoj||8qWgW{<_m}CVboqR$Fb;lJ=Kt zu~h5rjt2@jHxeAQGDriuYCdd%IakZy77bho)0Kd(QK9cg#|eOWb)dd{s*;4TEmYTf z2{!JTv(YC7t*iS97f6$On>3uWzkLKI8OiA!q@KQ>xgbU(9e$#&x}aDaJEO9F{kBZc zUj#5lg}IpcpG%CwVr{9(IG^eQ!We2Z^wBi~dRsa`7Qglz+cOY3_HghQPvg(r-g&GC zj>?f#NkjPS!gTQSuh=S0KqEm$7V$ZZCjwLo> zvm9CvlD0|!^I8Fpz-K6rx$J}sFjg^p=5Y-XOMuuQ-H3{qj=yBfLXh|7zsUiwHT81M z0@Yk@SUw#){W9F#X=&4QzXJr*&7}a3|0Gn`;!R&#Q0x~*R%ho0u+->o2)ls2D_!mM zEjci)jl=1+K<++Ed-O5p%~!o5;7PIP&b3bzi^;apbvjNw3=aKTf&Q_JE;RQdn<3jKdq344X}m;UT@pg%Yd2@b9kBRzgF5X z-hb_{f-wUI^kec^4kr>fM1ZCz;YV$WfnjA*cICZY;^07!4YIj4|5tX%m-vq^0>X5O z?{D`01t;hpws*FN`O19hJ8t*A1}@|IEHh+Q76MofEHp)jZ}D&c$^`a-bnX7i3}C%t zZn;%#yHDO{*Zl)LXg7cUORxgo1S)`un?23o5`gU}0fuPebT|VJce z)PLz0rvC!}m19=%eZ+BD6`mCWGr(^5wxt4$j*-9V1H(uaAK@>>GZCn-%J5lse`l`a zz99$R1=y?@QZs<5$qBIjE;|97?e^tgIRj+q8~uw#2F-SU z-4lRUXgbHozm^97dRcF^=yd##MLW;3420o7&u9Of0qw;3Mv6^%cstF30&Fs{-#CEx z1bV2i?^RQ_+<)u7z5;3VpOLb+I}manetde(&-NG9ShAD?>?dkZ3xTc`cH5Y7KNA zsQ?I_Y2>GD16oSdZ6X3LInzLMfX!aVJL`}g!bF)LsL@;=fW@dpV!-LyvJfnc?iUWT z`t_D@wDuK9eGzlj2CF?9zLDqLKRJsDVB3qmVEp@}+r z;s)^4^&VItz{_*(#PhG%LjCjQPb07@E53{Z#fxh$+Q3B@6iC2~wiliO6&+K5(QQU= zDFo*mZi3{$Se22127#rPVQ11r1$6nRs9Oe*quSNkA`6Uwlm2EQaGL9TM04I}@sWR! z1X4g`*?B8af1c0h#dw|P{FkCO_&L#4`Gi2ZfwECmNb;R<)5=R?Swne$Fh}aa%y~B03 zSseEe;CxT`*yeXhOoYCOZR96OziJO68yGt6PmYS?4V*#E%7t=kiD22>pcAayo8sVh>j){-<` zZjMzkP)H<$;o+Sj6)o_b7o^e{(RM6uYxN8{YML3PJye#LllZRVsx1NPZ9tO0bgQd9 z(FxS4FBRq*UbS|1F0_YyY0d6DFoS=}s^GsC9yq_i z7Gf#PG_X^tq{QOkDHEvVwiPWSut`^f*oO5lUQb~|@zz+P@xxHf5XJf=zAjg}7Lrwk z9T~9XRV6Ua48om`rCl+8#~@0iLFHO9D7V}8<4R|1f?hi_xWrVa|cF{_xelYJ8Z z%?tS&$Oa36&EL(@^aBp005-19)ER5l*>T<*wW_v*q^i``3e3+O(kITY+q`IklLWs$ zUK4gvgJ_a*`l_p}`$!t8QaNkPBtym=m7a8Nw7Q`ITtHO+X0k`+l`exs##50lHyz@AYrH8cUxe$Dr9|ZhvxiI-#+4D2m#l z9mk5Bzl=->&~o+k@?Fzs8BFzTmPtqC`KrFnjBz;Vb-HNg(Fil=Ik$2-k zFLU0!FdV8qugapJskhQ3jd>SdHdN{ffn(EtSjYiU2($r<=A4)bkBL5H|CohC_77s= zKxJf(QCRLQ4F1ai@}D;3Y?*o}L~u3BJxvH4n|CB90?aT@UNJQL^pi{}OIvt_ zhBOykm68O1>r7xP=l+^HAs`s8ZDp}Rx1fm%{-fhD9n)?;AGlj`MkE|(9Fug~_7K^L zO1(GdL};a*FW7cm=lq#sJKv{=ty~U}KERS^rG%hrY;e>k7g%6d7K>Xp)I zwsQ);S>Vt=dC|CAtEwnkUDbvi*6SrKa_4!;Fw^_F;~N>E?C&shl?PQsfS*nHO+eMx zg`JR7p}OH$w>0R=A~=Ncqy0K0A~^GS`hhQkPh6$#4I~eg)s-VTgwLjNu5$p2s@_k? zZ0k57QxgQsWc&6&sqnJOiyelp7agk%^n;l>bi1SO87Kp`hqfrKta|JKc!6$K{sQvR#V z)U{Zt;3t6i0}C2bjJsD#Uo6YM$G-t92dbib1t0qx6l#JeHzZ`(SU`L*6U<&ui#`87 zT4Wynh@pXuVo1(cUqF;gi!Ui>YjFg!`=&Bd#|Aaf90c z0tJ9GRgtvGD7aqxMiK~{6Ar4!{cz5#Fc|eXxTvnVy{K-vovg0yv6P3H69@j9l$(^e8onN7t+%Pgmyvu1#}?LD>sNq3 zjY82GrpRQAvei&?_qyh9?d$Du&6GL)3aQ}Ctx?cHsCuvo@8wI~I`V=h?F`izEn{i1 zkYo*X$0UTL+Xx+t=+*mU2Jo9Y7gRd(5V}dzswX0H?|y$;j!2_WD=2~=o@8|HA}XBa zBF82Js_y75W4}32lM|E#qiWF9zhT7^&;1^Ux2f;rl*Frv1W5`EH2##dh!fY$qsSsD zbNiLrGor27B=<*^3ss#_VO(l}TshHG%NXw*Q&LUgdAOCf&pnUr_dcJzK0{&wS`{VR z*uZr;6P{3-89kfR6t~%cy~uVjH(2@}%Vcba*wq6Ziv>EE57hAkU7|@R0(9t++%k3}n*~m+`$v=Ru?D92mUA*)J4O62@YIEZDa<5V5G!jp7_w0gD z^jYwJu%Krt9%?$<=HB|Njd&S?zN3Jpne*k+UR6hov+4DI&9ad%1SC0)VK?w7ixA1w z*oE5wZ)?kB`UTsQH$`Xgm9dPMynK`Xear@NVu=AvH|4W-thk>^0c1Z|d~aYOp5jt$ zKq5I;Wu8ZAS{1b;r9Fznf~>J^G;Qun2F-|C=qACr zPj$R%@}XL?1JmgC5K4W99WVhvcGp|V&csetaK|rsv~q_mfcfus{)x9_9-6LF z-^iC{89&TX(SX_}{MZ@F&N;L6m+^RHC%Fg+ld{a2S%js@>PEj6M%+`J800`cF~J8A zxfRi9{gfSzo|?vcWN3d@2&+uUh%`o|snt|!LXhQvA@{<4#5PIAM{o`W<(r9p!Th2y zkC`ElZZ9IZrLq(aFuJMpV%VrU#KXhJ0L=Gt6YMYF6c2EkxTv+ynpSD!;^w%0$KCoQ zROUiqodB7v4$<>W%{|i^CH09xCeft8ZyV)U;9@SKZOqwD-}{ z35KsXoL_KlimfY-bZE^Wbx(gO zn?bQgDniM_Nn>)Y(`P=KE-mF!_mxZuGera%*-5!g8r`!i>U*CkF@N>-Zcak5X?S>K zGp>?Ct|iF`CS-v)twoWSCK^^yPflRy0Q6Z-R7w0rAdTxyzNaEz zY!g925y`xRz!f6{4&liz4(j$ZZoh&8ex4h9md`0=;aq0gZwboG9TrxYnk~!tsCM>1 z9sz=`3$(0*ubrJzj;bcj;b&y7B;|%{-y3QXq;H(?MCdUIWJVZf{qb47b477T1NB3M zu|01K#Wp{&X=<& zD0zdrU#oXo7|dN_=7TMiV1eW=n`7v!6}TqmYnUA8=(k}Pzw~vP{gAG)YQ~&5Hr;@> z2Q0uzG{vA6{DE6D$Ehz12Y=#bg{wH8b}p@IazmeO{GboY}z%;*;ak74PUJBSoBVLI8#s6Q8w{o*tn@JJ%jX>*OYu3^ zMhod8dhmDK$Rk#rGjFyy)E$L!*vKXrvM`kO4p~{K31T?L8?QW#4jF3K&$&|T2L`)} z4yl!kCZAWuwq!Nt71St=8c^5f>*esNeMQu$yR4N>M)i^v6jOD7t9M>BT02wkqi{-# zPPj?#bv$}$77ga_t(!oXc2=}XFb(wY_YnmJ$WpyfcY$qcsRB08QxJ!j>7m6vY$V-p zFj=^hlH}S-H-w=Xl@gLIo-rX8Lz;sa&XKoCw)rqIen2_Mgv zt@&vXJ#Xxj5q5V&uZ0PR;$n|Y(u*gt&Dlb;u(arbDSKP0TX}`@uF3q<*K#s~PsLd@ogQm#oMN(;|0JFVh@7c{|=}chx_I;AQ z%3H-a{OzShU0G!1ZC>}aqA0SHsJ_0Yh$x!A+V(>#fyG!y-PQRG!Ea^G(C%|?XCWg8 z2|7gIm>iLDyzrW{7p3cAziNA|N)xzYZp=gcp-E5KHtSoC)$o*F%TH*`*x2Z2L&b>` z45+?u+rnSGZ09IH=Y=}+TMTp%`oK2pUxXTuL|j&md=1MhG(Z4n4EET+Saujf-3_ts zah!JZRh>>V4h<;67Yw41B8uokdr$$VtA4*iY}FFOi(Rl!K5bkvJLKDJA6#l5q%!wB z>WQlmGX1%;LP(m;qJu0P1mlljZn!Q7%M}ysbv|dLq-GN_`aN21#hgu6@sywV_g$3b z0SjBpvb@fEFn4OU2I$xu8qH4(GtyyHz5}U2T5fGl{J#C_$t!hBX$HC@w~Bh!v@RnJ zvtU}psBoTrWqPEIc5!dbxFRE~1uVN^6+v=7-{dGnAu+ahi8Ma&KF$y(_bD&>&sddY#W<(Ijt1w~1?(DqW-PmA;V`p=q@P zdpR^n!xo7@dh|?WSF$$5-4MfE4ByB|f1oa%FH@E{tJu{p-{T2nYsKFm*!YZ11e2~pE-4I~dqebb^)2Qj$p zMwAf&*LaAh_ozz!#;w*QS1kxU7B=T`kqNljjKP8&3xB|**~xe)NlY+!Ae0Y(V=9dZ z?8?}VP``p%T0$Iz6CLBspkLmd7r)x+393Cw6)TldJ^4-|4TooC0!&a>(cDJ&^U7T3 zQ|O?rL{G5Pg~S%2cD##wqJ31}!&xzz`&k;6!GD5MHG5C-T%O zp;8V!HNWv!qFPH&)GT*vsAKrkZv{+zL8@RlR2HJ&CQe#{bsWt`N-2fDQM+&OA9{;2 zW~`-T2(0a|~BETLi2(pFvoR2#jo&q5EFg&H5YNwo%zKyhga~G^{FKfPdVseG3;O_N^o=Rc!IrFx{h2aynfKyhVEDF^<#U(rU<{R*=;5Yi#{JLYkW=XjXf%SxIqgq>fmdoK*7Zi-ub; zsd&o<;0vr`BZC!!$(|2l-XizFdrxdN*M(HhwEJ7>P0f=_jvGYL!TKI(Y0RxU%~f{i_NXHa@>k1 zZc??>aUN0F5NuX?Z1N-|?O!WkTF^%H&2Lo6^|ddI3(tJ(OgSHr1O}>D1m+e2c8n2& z-A@;NAuJbdSpayIDfr=KTbtM~`k75+%MFkw)+uJA$f*->qs=rQ8_<_~EU+=bSwmd{ zXZ$a}44ocB+}K9wX!!fHcg^#w!g7-)hP#;j2=Q2JNuK;5m-(xX z?f#>ys=t3{WW_jAwnpycPgh}yApzvrBN`KB3_tim@2@8uH`8(4m&}%%jzxljnJHB}#8wp=tv*xW?SWxSGjv+OS%Uk}d~|f70o( zl7h)CwB`yJON81IejaeP=%t|-V=>ecF@Y0P_mVG%L(tTfme=D+i;QJ)&ZTHF_(_zb zYMsUxV-t=#I_9Kw!XobEka8w?o&|p(T)+|0oZ07?@Z~npAF{O_TcwUEPgJi52S+6z zbME+53{|qpFeBE-Qgi55g^<=*;PJ;XQ{O2<1bX!fT{;d4l8rDyQ|tE@ zl&O{5eeuBaT1?2s(5KmQ%V&ils?|WFYmJ%ptGD$pKYh7MqWpnYMiH0c8Q3p_+w&~R zfY^$w!^*SBMC8aUBFcy^=#3g@SyIF!+i7{k#o#aC0WLF=$a1)}Tm!!G-nXSPc+TE+O9-utUeI44qE|#|rSaR9^&Np3DXcZ?Pxj~` zUnq+=#%i?a9vw;3?A`El?o3Y&ITQ~57uSgj>l3hDli%oSTtih=L4?vC@q{ajx7w19 z@z0cvL=(<=$Rs@a40$Zu`z7YXlp>BwdJ#mtC%h5VS(-zj0nbxZN2v6m0b^)nF;*)- zp>&MwdwpWau4m1~NSb&bjpLS+WyCFbY^ekc3+jgJA%3yoA-k+Nk9)dR(Cm|vd8wJ| zqnL4;Dk!O%qnFqU3y!9F6tA%sps_~b#iJ+A?lS53%O<}x#tknGlL~_ein{(@HIud? zt~WG^I8NQW;v;XNh)5jYts_oil$j*N=j7aB2jmzgpWPZ>ZnFTtNi#jOYOHlnec%vIXcv+dBGA8DBmSgH zhIzi1AV%|KGSkg4T^E3Ca4Z!GsD&BS7-XPQyW)a`G@tkHH;800X>Bs^_dU9E zeHC^2*48UtS`_{%3GDXrxlLxXf8iOQ4cY=iLmxaUsjpCd8C*EC>~oeO+vIXDXU3>2ElX#288w0d7EXLX`%> z*Sq-HfzUBwMXSSICyaV9lsi)~$CVyB9#a~PJdf0n|uU%J)r-i4*# zq_YB?e<&iuR@G3T4mQxi$s+nnAe8uGkL7IAD6^enzRM z3Cz(&0&r3@dBTnGBf*k5tZ(t`qK zl384@-lBc^VZZRtEQ0uz)Fo*{6+D-0iOa67sah0Ah$lnh8EexCn1n+QY?G9y5IEOO z?n?6>I@ZqUwoxsykJ|E(9~h>rX;`MlvK&{L$uy%Ie{!&sGWU&(u8A|&XBC>|nD2IO zvukjQV;RWu@E{C(+zYLBS-&lVBG(jlSaO!#lEol7 ztB{g59h(X3=FStejQd-_5lJ#<=SLD#jrzfN3icF=kl-rB<Q;5Vp^|bPdtSqwxzJH*u@ug>K-S}c!yDJ?UwpA8<0Z!i0XLM z$N{-BL~fm!ee;1EX1iTQ-FYDjkC%#X5L$$kAL8R>QXqrMC}_DxkU6KoCjvjakg)|<|xy~4wKR)CKxkDn+4aND+@ zPmP6Ob%X0^Nx)raGz=C~m`^z@2(i{qUzvc2D(a>hJp^q{gSBwz%XbU6P~+3hq18nr zbes-m7@nTOO0D)OgUB+xWe3hgrNT-BikjRWkwa+ad!kBF=P*HhEZl7aMj?rDbHpi9 z0r0YK0Bcy79TKb%A&Or*j6VrSEMN@vib}W-6b-HhUHaHH)F!t27)5$Y{TOCC-qL^Q zVB~b)tfuA$5BFE@bgv1lKwC>YDr`$_&F_w)TT`|Tdct4!FgRAAL!$r`-(jrV4fznH&L(yvM6;pq-8h>^Cz(^p1KW9+qj zFQB96a(>EI#s_Ker(EM(m>zAE`tcoqEuR>sfP=cCyHZzV6?*shifF{OUSgLu2VrnG zAb+y@%xRX)c~O&tdIv7_#S2;URGbU8(d$q$vbMTM%Swg{HN%EY>uVE6O+{L8qic|<@^g9LeAyg&7Ch9`A%y^_A3Ij zfKeHaffPf9;t!CVGg;RM&FO$-;|_$>=yIKyWU^Hc&S|oFi66)MbiIM&Lb(BT#t62} zKO^l%XUDN{&cwh^n#?Gkin#>F>V4jxukKGjS$VzR2~cwRmJZY9YPtaKCy1sa+)4Dn zFGG{fMq^*sQkF1cD=IDxwyLxIP6sY{pL(iqK_VV6J7R3;t1BSc-E>7`8*6_;S4O5W zL76aOLbnmySP2!)J<8nG!13;dh7-P#fhQ0Y`mur@B+cuB0~GtH=$9&T5i(!JI6V)l{?hYcl9a0F7*)zGw1 zR@DITd)!rSu@zgRs%RDa#?_Ti--N%Zwfo5 zM(166YCS@!HkNMEWUu(n1(1+iAayo#^?!cIiSO4U<{e>gx|&gDSEs?~U;ctdaOjN) zFJf19<$&R$r>)PL6isXq|OUQnI9fyC1SNdE-z<~H=UF1BNNE;;Hy>O zSSn|Q!y~e>5lmh}qICFCpJkzjqlxM^vk!_1QNGBZk)MVkYJ8r-T{X5J*&2|bspg0U zCHoz+&bllXgRLpclymLNYBy^iPngV!fmIDl^DcrlUG#gh4T)%!$-=$!yC2^iJo>7C z#f5rr+E+aY6yF11nI4T*7sCY)f9ca{hnPQ+*c_>R-0ooj<`3-KqEx!qBz}XRp+TQR zPtkvvz#4C7O~IH)E4#eiZ9oC${p?pXqdZ7H=FOiyImXu?Ioko-R@`cfS53H`EbhU3 z5D|~^D2ZHz5nXaS8Zx5ak*iUUx8@CJWG_;O?|EgiRBd0J*3(5wGaPO>4YQ$P4uZD7 zfsn{(!x@4%JVR-kpn3H9=S1ynlVNJ5tq!Iu=dt`AoRVyF#z2aApJf6~9@ALDN@J79qY@si(Gt za{2oxj3ra)umw&;EM-eodDniwvX6w4b{^qN##(hC|8eOm-h;Z92t@#>v)+z!&ANtV z8SsDd<#6m)G6joju6Nk;A9B|6EN%EV;;uac4_1Sw+UI2^tsX;rmG?K+9Xs&f&E*TT zQwdX)cB}+2dY=(fbe@`0F0HiPLrBZP=}P6C^PGB-MpRyvwFGHj=DTRiCfiSMb7=~T z`)dL|N$KuX5)&a6<5zlRjJu?M$bQp%1~c|MV0Dea2aChr0R5UO(_^6u;ED&0Tuq^x zWVmD2B7pFbO?cmYW{W(s-Q#6ri$%C`I-b_Lob zn~H{8mj35?ryyTy);E1z5=vu(hnwv##3`f?IrtAGIRTNx^B|^9)vfjDGc6_)|I_(7Rt^py>1_akKgUqgN`@<%O^# zCEg1CKAKSBVZ3AGAjG5)6ewh2X1TGg<1ZpgYtE%~wNw5*93jPVll7Ao#oJOm-?21A z(~siPqOW`l>uN#7s^-LXzY=aY2BP896gb5rV)*Lpg=R(8w#(s`29A->nI(-VAqAu8 zg;RlrnZv40{Ps97s~&V#fKs%~u|~Cj+25veMo&MJ_ND#R4Q8Z$l%XT1rcU1Hg(GG7 z2d^*u!M&hYJi|tN%+Mq_rl!YI>SDvQ|ZOi&jEJ(rYIJJF(_Mk^5n^- zCEdek2o&LUdROrIqph8HvFrYmVe`T74O*r2B#%qy$lhTR@q5R?*iSdU@O3D1NAQns%%Q!$s$Bqs+h z9LN<;T7s}QqCrgc%Z9ltlJf2 zl$qp;2GICF$rEyHM01?LGs!BK95q(mLcLu3|4;&ct5X#OBFU$(*~7J%iXF(yYQtWZ2bOp+9B z$gp&6BpI2W{1t;*o@fkCDkQIm8MjC--Xy!H@8$OO+|~)(2+AWx_@X2|7t_!JRT7-# z=R#$X+0lpf*a@&*2a;U<0sWyIp(dEMp+|^Z0;#CW-`+R zjHqmmOBKD@@~s>6PUg$GiA?}`VY+iRC8(LPlxi+y&hrZ5OEO4n)d3Hw^JSQ$ry|_^ zL6c1G38O9&%ZhtVv@K*P@UXZ_vJDQD?@`uldDAKhjeDa?LFD^PWlscAMAQG&6r-4> zLKeS(%xk-VSp_YhndA`%c{u>`bA~ZM3dm5ZQ@O7~gDTYI7$I`P<1QpCWD7Uw4*SAR zQJnJirg8DkxL*YlkPB(Q&ay34<{lX(QO^P=Ju!71U7zGD3Z$5t#@H zWiY0Lc3KT`mKBU)rF;Zs0ZZKAVVk(62W$c_2b+K-$O9$`G}BZLMWmYSW7;4r2x?JO zE*u5sLedW;Y1J6oM&eYZF2Pw(W&RQ%S|hsPWiiPqjVkya7MRgFRE7RPvdn%iFtyLB zd|?Wm9`Kb^f@y7?YFWbC9aTGPF49wH_#teGi@lag4$viK%5hSa@^w%~@PrM~ruy8C zxF9xDt4{qCs3eqLf-u2!(*gtP(q$4_l*_=Ss#UPw*kfA51KC*;)qXr$Cb7oNhJ_;I zgWmqK5tC{!2Xwn;NEtV`hd=;j&_tmUo^^ptPXG@5HzdYD_{K0X%{nFL6xuT0S9D(s zjPV+MR0}}XMcIVq(s+O)6g=bF+|=(k?;*y`YH+GAna4^pod7Zi~^ zxVj9v?op7!KP2RHz@kBsv8sOrM=8FlLmA{}z{KFpIf_;W3{#?viq0TVyg))849b{X zkJeKkx%n@!k;`Vr1~`sSUm+;_Qk%v;d-XR6$o^({wf_t3^#296&G<%qKE2g|j5B1h zYd+U$(eUL{ACPU`c^}`T{2qQu`9sW%;d_)1{t)}R;un>d1%=|^@PKa&)%ETa?YWD;N4qL9X4%E?cH(4Plaq9-O&=y9#h<06!Z zj7YFt?+a4e0KLhch9}KIvOSRls7@k={OOQsRh{U>pJ@m(45Xwk3AOZKX<&)UY^Nwfe6#)_1pud^YdXinD2A%O0eEH;>nbX}Kx3d8>x z!@Q}?@29YzmMoZLqi-qXvHZ|W-Sl;|rIyQbsjEb~3RYy%e##E|x=d(E*4@$vUWTAZ z8XV~_*N_#kLdQ~(MYXM6K{@M8`A*??*C-V!p=Y;)G;C|Mmn?Ovq4CPtkPz${2ag}$ z_$eb`r1L>vnZMS;a^(X)lw?oemo*J#kwN{hj_dMs#5q_-|EHnqrfWX zc-w@xMRBZwFP8H#*pghD%xg~cSn!sX zMr0rb5}fD|Yn%;-*bd{bhi9+<3PIVAFA1HQsfB5{EpgE0kUfXmM4JWgxsJC_Q|$_!G6Rl!Wj#KJx z6q0gS8>JXnLG5#*$+U(e2TItkj{;WFCFupySX9hN1i^2b8W=EKZUExI#Zqt37qFs5 zbyg)XSTf9Hy5L-~PUnf0sz@R*PX%vI=Ank?u&~CtOl&=-!>zpO0TZkuEiMiCv_?yn z&=`U!nwBytvQNZkcrH{_Nr2^4m>ES<;z+X0C+&n;hswrU6!`*XjJ((M3u!F`RPi4$ zb68fLSM)Vla%2cf%yA7X1%22Yc*6q|wRswYqMYaP#g!J)bjGQsFWM?ZkQW81Bw4+` zFtGA)XQr-bMz~H3Wm!Fn;o=TRxxG%pm@3|yCby*Tvusag zV@R5R&U`gll2O|rbZ!3#na7u!q*Ibvk=Ec^V_QZm6HiYcV77PT%e;%X(2i zgDM6Z^#iO}I=d7B*%rP>`7wgAZ((n-AK=%NzlT?r-yP2IigLhN?wU#f06+jqL_t*d zC{N-1Q-?ulC|#sLi@}yWEeN3O7zSk2mu?b%RarTg)Doh-$}l^o^<&K0k&*Juntq`f zouW?U%?&yglxbQ6vu_Bx&Jb)347`r_5n$mPSUAqGLEP!-{%~}NpT*)hKHNhPwm%#n z?GFbB2Re?9j?h6z3d)k2z6ws3$U$5qzx&kE#q!dYV z;G}UEvU4!whUdHp7e8-2!6F2UenlOCK$ZtyZb=dJR!Zy{=t}JhkrDC`My;L+byH*s z$9{MLcpE~S!)`VdaMa= zofVyEGxvB(=5@CKh{cg(CNnwml?b*&q^ zWG*%Ns;QV$V+84Jsi?-qny2<`{Nb@u`L8-I|$TptYS}6!VsXX;0Jsw1Gjv@WDUnT z`6Z1KS&wUyxadOaBF+I@(w$sdZczmA;2(g*(1c38%^Lr6zzADkUS)uW7PCI)W`tx`~y zT}*oZ7y#?kI7@~|Rb8E4645>D#Yd=p^L=a!46v@2C}`+GX$BM*`DX-FCUSJTOP zQX7LXoy!P@&4B6RilDa80i%lzxkLtrt)$tmwU)AGjPr`3krVI$1ud^lCf%GS*aLh1 znf~%vrWhXbVeXrdA-XiyLY=G`DTv@J!0coCC1CIw80Aj+kY#D3#*v)M0m4Em91SaK zLu05h2V_)6KPV4g_I2Sc@<=k7Kti77lH1LkHbowm1WwTC5Ya3re;I1pZu=wm7^|gd zyd{7)m^QwqkH6%NK@Mk9s#=8tb9R60vuJbpqT=m~VP43R)C8!?rSE#?Quku}WK~9J zSW1>XQtZk^Rl(Y`9Q2oAeO|F;a?>=ptEiwEF~*RqNzpFBs`|xLqZR48z8L>vTwymo zwz$_c#zfxnq0J$s9fc!HonA|NTzZ+)o=%7TMWn$j6HaOw`T~z)>iR_9!$)v zuf?&tvW*~Zd)UObSUlDdu<=!AyN-;KBOW-zx2yxldO94uv7K&17y}vskTVWo5Ejq> zsG|zJNWG$1zWfPZUH%xs*^h^#<5&0u)Z;6=iSpuoFP#PFWnFX=4?C23btH$&oxHQSQ>aI?Wn@nsu)-}h5RhT^O9wjz zqIj$#Kx06*zxQ%@{`Hr`i)YwN?HIuqgDnJI$49S~pJAuoQ+y%*6!{r;?&XY`eq_Mc zm|8c)wL@G>7C)PX_OM*-sq7{qrvy)J39xB1(YOE--*Cpr3Ig4fmMjT`o+hEtH}eP> zFzjrHZaA!Sz_S-(Nb&-3$pfF*oI+WymI7%ix`IfibvRXV!hd^1qO*aufW^vr3?~~y zBP#S!f?1Mj<8P!6nLJ9Lg*kCSQ=a^o;5IdUOUb<)YkM2Hd!>@arm4z8v^G0a@Cugu zCc$#Ol9!6oWU?`O285RQAPLuGgmuMA_CrlGL)2RV*A0lWUDS(@`wO8l8ZthK=*N!m z#syn=GY<#?-S*Zi;+=Jp%p{l+CBpStOt4yX>7i5U4GxcC*O(XE0$QIF4vp?LyY9T^ zQhA=(5%FaJzMi2_|D&$)CL1dJh1A$*Gh2EgsZ&f23Z`%c7Iu{D(snuL$VFLgSE;ae zC2>^Ghk7XF(Jwh2BM5u2f~M0o%!J{M+4g-M5s>W+8;A!s@WzZm8DZ;~ExWh-czAIC zUC`l88Yfp6l;L?3_b%pq7GbjGlrw0YNh1xv;zL|a#?S~arSatkBxs0WEP!B1Gh`8K z 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�X3sZS$g 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 { const { document } = parseHTML(html); const imgs = document.getElementsByTagName('img'); - assert.equal(imgs.length, 4); + assert.equal(imgs.length, 6); // Image using a relative path assert.equal(imgs.item(0).src.startsWith('/_image'), true); // Image using an aliased path @@ -38,6 +38,10 @@ describe('MDX Page', () => { assert.equal(imgs.item(2).title, 'Houston title'); // Image with spaces in the path assert.equal(imgs.item(3).src.startsWith('/_image'), true); + // Image using a relative path with no slashes + assert.equal(imgs.item(4).src.startsWith('/_image'), true); + // Image using a relative path with nested directory + assert.equal(imgs.item(5).src.startsWith('/_image'), true); }); for (const route of imageTestRoutes) { From e0124fe1b5cb40094c8090c3b8504e0067903709 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:07:50 -0700 Subject: [PATCH 79/96] [ci] release (#10777) Co-authored-by: github-actions[bot] --- .changeset/afraid-laws-speak.md | 5 -- .changeset/brown-news-roll.md | 5 -- .changeset/curly-badgers-boil.md | 16 ---- .changeset/eight-hotels-try.md | 5 -- .changeset/famous-seals-camp.md | 5 -- .changeset/many-hairs-jump.md | 5 -- .changeset/mean-candles-hammer.md | 5 -- .changeset/modern-mugs-raise.md | 5 -- .changeset/orange-ladybugs-nail.md | 5 -- .changeset/rich-spoons-fold.md | 5 -- .changeset/stupid-countries-warn.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 6 +- examples/component/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-lit/package.json | 2 +- examples/framework-multiple/package.json | 2 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 2 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 2 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/middleware/package.json | 2 +- examples/minimal/package.json | 2 +- examples/non-html-pages/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/view-transitions/package.json | 2 +- examples/with-markdoc/package.json | 2 +- examples/with-markdown-plugins/package.json | 2 +- examples/with-markdown-shiki/package.json | 2 +- examples/with-mdx/package.json | 4 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 4 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 20 +++++ packages/astro/package.json | 2 +- packages/integrations/mdx/CHANGELOG.md | 18 ++++ packages/integrations/mdx/package.json | 2 +- packages/integrations/sitemap/CHANGELOG.md | 6 ++ packages/integrations/sitemap/package.json | 2 +- pnpm-lock.yaml | 94 ++++++++++++++------- 45 files changed, 141 insertions(+), 131 deletions(-) delete mode 100644 .changeset/afraid-laws-speak.md delete mode 100644 .changeset/brown-news-roll.md delete mode 100644 .changeset/curly-badgers-boil.md delete mode 100644 .changeset/eight-hotels-try.md delete mode 100644 .changeset/famous-seals-camp.md delete mode 100644 .changeset/many-hairs-jump.md delete mode 100644 .changeset/mean-candles-hammer.md delete mode 100644 .changeset/modern-mugs-raise.md delete mode 100644 .changeset/orange-ladybugs-nail.md delete mode 100644 .changeset/rich-spoons-fold.md delete mode 100644 .changeset/stupid-countries-warn.md diff --git a/.changeset/afraid-laws-speak.md b/.changeset/afraid-laws-speak.md deleted file mode 100644 index 62e4a8bd6f04..000000000000 --- a/.changeset/afraid-laws-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Correctly sets `build.assets` directory during `vite` config setup diff --git a/.changeset/brown-news-roll.md b/.changeset/brown-news-roll.md deleted file mode 100644 index ff57e1bc4054..000000000000 --- a/.changeset/brown-news-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes cookies type inference diff --git a/.changeset/curly-badgers-boil.md b/.changeset/curly-badgers-boil.md deleted file mode 100644 index f7fc51ecb9c9..000000000000 --- a/.changeset/curly-badgers-boil.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -"@astrojs/mdx": patch ---- - -Fixes an issue where images in MDX required a relative specifier (e.g. `./`) - -Now, you can use the standard `![](img.png)` syntax in MDX files for images colocated in the same folder: no relative specifier required! - -There is no need to update your project; your existing images will still continue to work. However, you may wish to remove any relative specifiers from these MDX images as they are no longer necessary: - -```diff -- ![A cute dog](./dog.jpg) -+ ![A cute dog](dog.jpg) - -``` - diff --git a/.changeset/eight-hotels-try.md b/.changeset/eight-hotels-try.md deleted file mode 100644 index f1fab2897d1f..000000000000 --- a/.changeset/eight-hotels-try.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Disables streaming when rendering site with `output: "static"` diff --git a/.changeset/famous-seals-camp.md b/.changeset/famous-seals-camp.md deleted file mode 100644 index b1703ee45ee0..000000000000 --- a/.changeset/famous-seals-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/sitemap": patch ---- - -Improves performance when generating the sitemap data diff --git a/.changeset/many-hairs-jump.md b/.changeset/many-hairs-jump.md deleted file mode 100644 index 2e855708fb89..000000000000 --- a/.changeset/many-hairs-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Handles possible null value when calling `which-pm` during dynamic package installation diff --git a/.changeset/mean-candles-hammer.md b/.changeset/mean-candles-hammer.md deleted file mode 100644 index cb825a493a58..000000000000 --- a/.changeset/mean-candles-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes `astro add` sometimes modifying `baseUrl` unintentionally diff --git a/.changeset/modern-mugs-raise.md b/.changeset/modern-mugs-raise.md deleted file mode 100644 index 0796acf9f8eb..000000000000 --- a/.changeset/modern-mugs-raise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes Picture component specialFormatsFallback fallback check diff --git a/.changeset/orange-ladybugs-nail.md b/.changeset/orange-ladybugs-nail.md deleted file mode 100644 index b1b1f25b7505..000000000000 --- a/.changeset/orange-ladybugs-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/mdx": patch ---- - -Removes internal MDX processor on `buildEnd` to free up memory diff --git a/.changeset/rich-spoons-fold.md b/.changeset/rich-spoons-fold.md deleted file mode 100644 index 217562a24ce8..000000000000 --- a/.changeset/rich-spoons-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes assets endpoint in serverless returning 404 in certain situations where the website might be under a protected route diff --git a/.changeset/stupid-countries-warn.md b/.changeset/stupid-countries-warn.md deleted file mode 100644 index 27eeea281d4c..000000000000 --- a/.changeset/stupid-countries-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes a timing issue in the view transition simulation. diff --git a/examples/basics/package.json b/examples/basics/package.json index e32ef884cb3e..5c22341e6577 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index f7e1d6b4b8a2..afadb4360f96 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -11,9 +11,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^2.3.0", + "@astrojs/mdx": "^2.3.1", "@astrojs/rss": "^4.0.5", - "@astrojs/sitemap": "^3.1.2", - "astro": "^4.6.1" + "@astrojs/sitemap": "^3.1.3", + "astro": "^4.6.2" } } diff --git a/examples/component/package.json b/examples/component/package.json index e4bbfe2e9459..352bccdfbfbf 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index f731ddf0ff86..00708fe30465 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -14,6 +14,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.5", "alpinejs": "^3.13.3", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json index 4cfbb0e05757..6243b58fa89d 100644 --- a/examples/framework-lit/package.json +++ b/examples/framework-lit/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/lit": "^4.0.1", "@webcomponents/template-shadowroot": "^0.2.1", - "astro": "^4.6.1", + "astro": "^4.6.2", "lit": "^3.1.2" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index 5f8d13af7168..dabc84475a35 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -18,7 +18,7 @@ "@astrojs/vue": "^4.1.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.1", + "astro": "^4.6.2", "preact": "^10.19.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index f36f406a5e20..993a445a2b8b 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@preact/signals": "^1.2.1", - "astro": "^4.6.1", + "astro": "^4.6.2", "preact": "^10.19.2" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index 205b05d6a9e3..b0eb38cb6b31 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -14,7 +14,7 @@ "@astrojs/react": "^3.3.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.1", + "astro": "^4.6.2", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index bed80c53f211..e9709aec3530 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/solid-js": "^4.1.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "solid-js": "^1.8.5" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index d41823b0404d..a3aef84631fb 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "svelte": "^4.2.5" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index 28bab6c81c41..c4877b256e22 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/vue": "^4.1.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "vue": "^3.3.8" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index 599a3a1c8eab..5314b60259cc 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index 91f5793991b7..db0616460131 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/middleware/package.json b/examples/middleware/package.json index cb608654a3dd..6c43007318d8 100644 --- a/examples/middleware/package.json +++ b/examples/middleware/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.1", + "astro": "^4.6.2", "html-minifier": "^4.0.0" }, "devDependencies": { diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 840a5ac7c6dd..031742f2c721 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json index 260c84d09f61..777c3a6da422 100644 --- a/examples/non-html-pages/package.json +++ b/examples/non-html-pages/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index caec4c105fa0..3f03d77df483 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index 45210122da37..ba0c478bc0a0 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -14,7 +14,7 @@ "dependencies": { "@astrojs/node": "^8.2.5", "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "svelte": "^4.2.5" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index bc4e0e23a21b..d6500f40680b 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1", + "astro": "^4.6.2", "sass": "^1.69.5", "sharp": "^0.32.6" } diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json index 512a2bcc80c4..2ef6379f89f2 100644 --- a/examples/view-transitions/package.json +++ b/examples/view-transitions/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@astrojs/tailwind": "^5.1.0", "@astrojs/node": "^8.2.5", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index f799e483f45c..b398a7ce4a64 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/markdoc": "^0.10.0", - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json index 84b5ca0dcfae..4c70d2970e14 100644 --- a/examples/with-markdown-plugins/package.json +++ b/examples/with-markdown-plugins/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/markdown-remark": "^5.1.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "hast-util-select": "^6.0.2", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json index 580dd76819f3..5e099595859c 100644 --- a/examples/with-markdown-shiki/package.json +++ b/examples/with-markdown-shiki/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.1" + "astro": "^4.6.2" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index c1b05389ace3..68d15e5ff4a7 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -11,9 +11,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^2.3.0", + "@astrojs/mdx": "^2.3.1", "@astrojs/preact": "^3.2.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "preact": "^10.19.2" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index 122a12cfc7f9..c7194eef7a6d 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@nanostores/preact": "^0.5.0", - "astro": "^4.6.1", + "astro": "^4.6.2", "nanostores": "^0.9.5", "preact": "^10.19.2" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index a6ff3928869e..e4bf87d3126c 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -11,10 +11,10 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^2.3.0", + "@astrojs/mdx": "^2.3.1", "@astrojs/tailwind": "^5.1.0", "@types/canvas-confetti": "^1.6.3", - "astro": "^4.6.1", + "astro": "^4.6.2", "autoprefixer": "^10.4.15", "canvas-confetti": "^1.9.1", "postcss": "^8.4.28", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 9f98c60e0e42..75bc03d3be53 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -12,7 +12,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^4.6.1", + "astro": "^4.6.2", "vitest": "^1.3.1" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 5161ed864e28..3156fd3b9dcc 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,25 @@ # astro +## 4.6.2 + +### Patch Changes + +- [#10732](https://github.com/withastro/astro/pull/10732) [`a92e263beb6e0166f1f13c97803d1861793e2a99`](https://github.com/withastro/astro/commit/a92e263beb6e0166f1f13c97803d1861793e2a99) Thanks [@rishi-raj-jain](https://github.com/rishi-raj-jain)! - Correctly sets `build.assets` directory during `vite` config setup + +- [#10776](https://github.com/withastro/astro/pull/10776) [`1607face67051b16d4648555f1001b2a9308e377`](https://github.com/withastro/astro/commit/1607face67051b16d4648555f1001b2a9308e377) Thanks [@fshafiee](https://github.com/fshafiee)! - Fixes cookies type inference + +- [#10796](https://github.com/withastro/astro/pull/10796) [`90669472df3a05b33f0de46fd2d039e3eba7f7dd`](https://github.com/withastro/astro/commit/90669472df3a05b33f0de46fd2d039e3eba7f7dd) Thanks [@bluwy](https://github.com/bluwy)! - Disables streaming when rendering site with `output: "static"` + +- [#10782](https://github.com/withastro/astro/pull/10782) [`b0589d05538fcc77dd3c38198bf93f3548362cd8`](https://github.com/withastro/astro/commit/b0589d05538fcc77dd3c38198bf93f3548362cd8) Thanks [@nektro](https://github.com/nektro)! - Handles possible null value when calling `which-pm` during dynamic package installation + +- [#10774](https://github.com/withastro/astro/pull/10774) [`308b5d8c122f44e7724bb2f3ad3aa5c43a83e584`](https://github.com/withastro/astro/commit/308b5d8c122f44e7724bb2f3ad3aa5c43a83e584) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Fixes `astro add` sometimes modifying `baseUrl` unintentionally + +- [#10783](https://github.com/withastro/astro/pull/10783) [`4dbd545304d1a8af903c8c97f237eb55c988c40b`](https://github.com/withastro/astro/commit/4dbd545304d1a8af903c8c97f237eb55c988c40b) Thanks [@jurajkapsz](https://github.com/jurajkapsz)! - Fixes Picture component specialFormatsFallback fallback check + +- [#10775](https://github.com/withastro/astro/pull/10775) [`06843121450899ecf0390ca4efaff6c9a6fe0f75`](https://github.com/withastro/astro/commit/06843121450899ecf0390ca4efaff6c9a6fe0f75) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Fixes assets endpoint in serverless returning 404 in certain situations where the website might be under a protected route + +- [#10787](https://github.com/withastro/astro/pull/10787) [`699f4559a279b374bddb3e5e48c72afe2709e8e7`](https://github.com/withastro/astro/commit/699f4559a279b374bddb3e5e48c72afe2709e8e7) Thanks [@martrapp](https://github.com/martrapp)! - Fixes a timing issue in the view transition simulation. + ## 4.6.1 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 86b7ef650ffa..5fee4830df43 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "4.6.1", + "version": "4.6.2", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/integrations/mdx/CHANGELOG.md b/packages/integrations/mdx/CHANGELOG.md index 105babf12f57..b40ce2e00097 100644 --- a/packages/integrations/mdx/CHANGELOG.md +++ b/packages/integrations/mdx/CHANGELOG.md @@ -1,5 +1,23 @@ # @astrojs/mdx +## 2.3.1 + +### Patch Changes + +- [#10754](https://github.com/withastro/astro/pull/10754) [`3e7a12c8532411e580fcfdb8445cad8fc8499291`](https://github.com/withastro/astro/commit/3e7a12c8532411e580fcfdb8445cad8fc8499291) Thanks [@rishi-raj-jain](https://github.com/rishi-raj-jain)! - Fixes an issue where images in MDX required a relative specifier (e.g. `./`) + + Now, you can use the standard `![](img.png)` syntax in MDX files for images colocated in the same folder: no relative specifier required! + + There is no need to update your project; your existing images will still continue to work. However, you may wish to remove any relative specifiers from these MDX images as they are no longer necessary: + + ```diff + - ![A cute dog](./dog.jpg) + + ![A cute dog](dog.jpg) + + ``` + +- [#10770](https://github.com/withastro/astro/pull/10770) [`88ee63a3ba4488c60348cb821034e6d4a057efd0`](https://github.com/withastro/astro/commit/88ee63a3ba4488c60348cb821034e6d4a057efd0) Thanks [@bluwy](https://github.com/bluwy)! - Removes internal MDX processor on `buildEnd` to free up memory + ## 2.3.0 ### Minor Changes diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index ac9e775a66be..5dbc7dd952dc 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/mdx", "description": "Add support for MDX pages in your Astro site", - "version": "2.3.0", + "version": "2.3.1", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/sitemap/CHANGELOG.md b/packages/integrations/sitemap/CHANGELOG.md index 24902965aee9..9df35d31f53f 100644 --- a/packages/integrations/sitemap/CHANGELOG.md +++ b/packages/integrations/sitemap/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/sitemap +## 3.1.3 + +### Patch Changes + +- [#10795](https://github.com/withastro/astro/pull/10795) [`1ce22881c657becf0397b83ac393fb5d2399104c`](https://github.com/withastro/astro/commit/1ce22881c657becf0397b83ac393fb5d2399104c) Thanks [@bluwy](https://github.com/bluwy)! - Improves performance when generating the sitemap data + ## 3.1.2 ### Patch Changes diff --git a/packages/integrations/sitemap/package.json b/packages/integrations/sitemap/package.json index abf9f263b8b6..9ccbf3d5bebc 100644 --- a/packages/integrations/sitemap/package.json +++ b/packages/integrations/sitemap/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/sitemap", "description": "Generate a sitemap for your Astro site", - "version": "3.1.2", + "version": "3.1.3", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 336e24512a8a..2eeba9ac48e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,28 +134,28 @@ importers: examples/basics: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/blog: dependencies: '@astrojs/mdx': - specifier: ^2.3.0 + specifier: ^2.3.1 version: link:../../packages/integrations/mdx '@astrojs/rss': specifier: ^4.0.5 version: link:../../packages/astro-rss '@astrojs/sitemap': - specifier: ^3.1.2 + specifier: ^3.1.3 version: link:../../packages/integrations/sitemap astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/framework-alpine: @@ -170,7 +170,7 @@ importers: specifier: ^3.13.3 version: 3.13.8 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/framework-lit: @@ -182,7 +182,7 @@ importers: specifier: ^0.2.1 version: 0.2.1 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro lit: specifier: ^3.1.2 @@ -212,7 +212,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -242,7 +242,7 @@ importers: specifier: ^1.2.1 version: 1.2.1(preact@10.20.2) astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -260,7 +260,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro react: specifier: ^18.2.0 @@ -275,7 +275,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/solid astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro solid-js: specifier: ^1.8.5 @@ -287,7 +287,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -299,7 +299,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/vue astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro vue: specifier: ^3.3.8 @@ -311,13 +311,13 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/middleware: @@ -326,7 +326,7 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro html-minifier: specifier: ^4.0.0 @@ -339,19 +339,19 @@ importers: examples/minimal: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/non-html-pages: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/ssr: @@ -363,7 +363,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -372,7 +372,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro sass: specifier: ^1.69.5 @@ -390,7 +390,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/integrations/tailwind astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/with-markdoc: @@ -399,7 +399,7 @@ importers: specifier: ^0.10.0 version: link:../../packages/integrations/markdoc astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/with-markdown-plugins: @@ -408,7 +408,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/markdown/remark astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro hast-util-select: specifier: ^6.0.2 @@ -429,19 +429,19 @@ importers: examples/with-markdown-shiki: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro examples/with-mdx: dependencies: '@astrojs/mdx': - specifier: ^2.3.0 + specifier: ^2.3.1 version: link:../../packages/integrations/mdx '@astrojs/preact': specifier: ^3.2.0 version: link:../../packages/integrations/preact astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -456,7 +456,7 @@ importers: specifier: ^0.5.0 version: 0.5.1(nanostores@0.9.5)(preact@10.20.2) astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro nanostores: specifier: ^0.9.5 @@ -468,7 +468,7 @@ importers: examples/with-tailwindcss: dependencies: '@astrojs/mdx': - specifier: ^2.3.0 + specifier: ^2.3.1 version: link:../../packages/integrations/mdx '@astrojs/tailwind': specifier: ^5.1.0 @@ -477,7 +477,7 @@ importers: specifier: ^1.6.3 version: 1.6.4 astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro autoprefixer: specifier: ^10.4.15 @@ -495,7 +495,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^4.6.1 + specifier: ^4.6.2 version: link:../../packages/astro vitest: specifier: ^1.3.1 @@ -9468,6 +9468,7 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + requiresBuild: true dev: false /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.4): @@ -9578,6 +9579,7 @@ packages: /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + requiresBuild: true dependencies: buffer: 5.7.1 inherits: 2.0.4 @@ -9869,6 +9871,7 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + requiresBuild: true dev: false /chownr@2.0.0: @@ -9993,9 +9996,11 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + requiresBuild: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + requiresBuild: true dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 @@ -10009,6 +10014,7 @@ packages: /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + requiresBuild: true dependencies: color-convert: 2.0.1 color-string: 1.9.1 @@ -10343,6 +10349,7 @@ packages: /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + requiresBuild: true dependencies: mimic-response: 3.1.0 dev: false @@ -10364,6 +10371,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + requiresBuild: true dev: false /deep-is@0.1.4: @@ -10692,6 +10700,7 @@ packages: /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + requiresBuild: true dependencies: once: 1.4.0 dev: false @@ -11139,6 +11148,7 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + requiresBuild: true dev: false /express@4.19.2: @@ -11213,6 +11223,7 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + requiresBuild: true dev: false /fast-glob@3.3.2: @@ -11374,6 +11385,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + requiresBuild: true dev: false /fs-extra@10.1.0: @@ -11527,6 +11539,7 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + requiresBuild: true dev: false /github-slugger@2.0.0: @@ -12109,6 +12122,7 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + requiresBuild: true dev: false /inline-style-parser@0.1.1: @@ -12156,6 +12170,7 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + requiresBuild: true dev: false /is-bigint@1.0.4: @@ -13516,6 +13531,7 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + requiresBuild: true dev: false /min-indent@1.0.1: @@ -13596,6 +13612,7 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + requiresBuild: true dev: false /mkdirp@1.0.4: @@ -13693,6 +13710,7 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + requiresBuild: true dev: false /natural-compare@1.4.0: @@ -13730,12 +13748,14 @@ packages: /node-abi@3.57.0: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} + requiresBuild: true dependencies: semver: 7.6.0 dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + requiresBuild: true dev: false /node-domexception@1.0.0: @@ -14710,6 +14730,7 @@ packages: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} hasBin: true + requiresBuild: true dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 @@ -14827,6 +14848,7 @@ packages: /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + requiresBuild: true dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -14884,6 +14906,7 @@ packages: /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + requiresBuild: true dependencies: deep-extend: 0.6.0 ini: 1.3.8 @@ -15659,10 +15682,12 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true dev: false /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + requiresBuild: true dependencies: decompress-response: 6.0.0 once: 1.4.0 @@ -15686,6 +15711,7 @@ packages: /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + requiresBuild: true dependencies: is-arrayish: 0.3.2 dev: false @@ -15851,6 +15877,7 @@ packages: /streamx@2.16.1: resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + requiresBuild: true dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -16175,6 +16202,7 @@ packages: /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + requiresBuild: true dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -16184,6 +16212,7 @@ packages: /tar-fs@3.0.5: resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + requiresBuild: true dependencies: pump: 3.0.0 tar-stream: 3.1.7 @@ -16195,6 +16224,7 @@ packages: /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + requiresBuild: true dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -16205,6 +16235,7 @@ packages: /tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + requiresBuild: true dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 @@ -16404,6 +16435,7 @@ packages: /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 dev: false From 635d65c62711dee39026fed77329370be854f1c3 Mon Sep 17 00:00:00 2001 From: Nick Dubelman Date: Tue, 16 Apr 2024 14:28:20 -0700 Subject: [PATCH 80/96] db: export 'alias' from drizzle-orm/sqlite-core (#10789) * db: export 'alias' from drizzle-orm/sqlite-core * chore: changeset * fix: changeset target --------- Co-authored-by: Ben Holmes --- .changeset/few-pets-relax.md | 5 +++++ packages/db/src/runtime/virtual.ts | 2 ++ packages/db/virtual.d.ts | 1 + 3 files changed, 8 insertions(+) create mode 100644 .changeset/few-pets-relax.md diff --git a/.changeset/few-pets-relax.md b/.changeset/few-pets-relax.md new file mode 100644 index 000000000000..7e2682c27470 --- /dev/null +++ b/.changeset/few-pets-relax.md @@ -0,0 +1,5 @@ +--- +"@astrojs/db": patch +--- + +Expose the Drizzle `alias` utility from `astro:db` to enable self-joins on a table. diff --git a/packages/db/src/runtime/virtual.ts b/packages/db/src/runtime/virtual.ts index ac118d6930b6..4159e74c1a5c 100644 --- a/packages/db/src/runtime/virtual.ts +++ b/packages/db/src/runtime/virtual.ts @@ -92,3 +92,5 @@ export { max, min, } from 'drizzle-orm'; + +export { alias } from 'drizzle-orm/sqlite-core'; diff --git a/packages/db/virtual.d.ts b/packages/db/virtual.d.ts index efe9e8387d30..6c93137a20b5 100644 --- a/packages/db/virtual.d.ts +++ b/packages/db/virtual.d.ts @@ -42,4 +42,5 @@ declare module 'astro:db' { export const sumDistinct: RuntimeConfig['sumDistinct']; export const max: RuntimeConfig['max']; export const min: RuntimeConfig['min']; + export const alias: RuntimeConfig['alias']; } From 6c310f495798879752acd7f288784246a5e5a68f Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 17 Apr 2024 09:37:22 +0100 Subject: [PATCH 81/96] chore: use Biome to format JS files (#10788) * chore: configuration * chore: update main commands * chore: revert formatting package.json * chore: rebase --- .prettierignore | 9 +++ biome.json | 46 ++++++++--- package.json | 6 +- packages/astro-rss/test/rss.test.js | 13 +-- packages/astro/astro-jsx.d.ts | 2 - packages/astro/src/@types/astro.ts | 81 +++++++++---------- .../astro/src/assets/vite-plugin-assets.ts | 4 +- packages/astro/src/cli/install-package.ts | 4 +- packages/astro/src/core/errors/dev/utils.ts | 4 +- packages/astro/src/core/errors/errors-data.ts | 4 +- .../client/dev-toolbar/apps/settings.ts | 5 +- .../src/runtime/client/dev-toolbar/toolbar.ts | 8 +- .../client/dev-toolbar/ui-library/tooltip.ts | 6 +- packages/astro/src/transitions/router.ts | 2 +- packages/astro/test/test-adapter.js | 6 +- packages/db/src/core/errors.ts | 3 +- packages/db/src/core/schemas.ts | 4 +- packages/upgrade/src/actions/context.ts | 6 +- pnpm-lock.yaml | 78 +++++++++--------- prettier.config.js | 2 +- 20 files changed, 175 insertions(+), 118 deletions(-) diff --git a/.prettierignore b/.prettierignore index 0703752ee5d7..64e94860fa24 100644 --- a/.prettierignore +++ b/.prettierignore @@ -19,3 +19,12 @@ benchmark/results/ # Files pnpm-lock.yaml + +# Formatted by Biome +**/*.json +**/*.js +**/*.ts +**/*.tsx +**/*.jsx +**/*.mjs +**/*.cjs diff --git a/biome.json b/biome.json index e3cd21509b6b..aed74ad49681 100644 --- a/biome.json +++ b/biome.json @@ -1,16 +1,44 @@ { - "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", "files": { - "include": ["test/**", "e2e/**", "packages/**"], - "ignore": ["vendor", "dist/**"] + "ignore": ["vendor", "dist/**"], + "include": ["test/**", "e2e/**", "packages/**"] }, - "organizeImports": { - "enabled": true + "formatter": { + "indentStyle": "tab", + "indentWidth": 2, + "lineWidth": 100, + "ignore": [ + "benchmark/projects/", + "benchmark/results/", + "**/dist/**", + "**/smoke/**", + "**/fixtures/**", + "**/vendor/**", + "**/.vercel/**", + ".changeset", + "pnpm-lock.yaml", + "package.json", + "*.astro" + ] }, - "linter": { - "enabled": false + "organizeImports": { "enabled": true }, + "linter": { "enabled": false }, + "javascript": { + "formatter": { + "trailingComma": "es5", + "quoteStyle": "single", + "semicolons": "always" + } }, - "formatter": { - "enabled": false + "json": { + "parser": { + "allowComments": true, + "allowTrailingCommas": true + }, + "formatter": { + "indentStyle": "space", + "trailingCommas": "none" + } } } diff --git a/package.json b/package.json index 2a2eadaa3fd8..3463e19c3ea6 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "dev": "turbo run dev --concurrency=40 --parallel --filter=astro --filter=create-astro --filter=\"@astrojs/*\" --filter=\"@benchmark/*\"", "format": "pnpm run format:code && pnpm run format:imports", "format:ci": "pnpm run format:code:ci && pnpm run format:imports:ci", - "format:code": "prettier -w \"**/*\" --ignore-unknown --cache", - "format:code:ci": "prettier -w \"**/*\" --ignore-unknown --cache --check", + "format:code": "biome format ./ --write && prettier -w \"**/*\" --ignore-unknown --cache", + "format:code:ci": "biome format ./ && prettier -w \"**/*\" --ignore-unknown --cache --check", "format:imports": "biome check --apply .", "format:imports:ci": "biome ci .", "test": "turbo run test --concurrency=1 --filter=astro --filter=create-astro --filter=\"@astrojs/*\"", @@ -53,7 +53,7 @@ }, "devDependencies": { "@astrojs/check": "^0.5.8", - "@biomejs/biome": "1.5.3", + "@biomejs/biome": "1.6.4", "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.2", "@eslint/eslintrc": "^3.0.2", diff --git a/packages/astro-rss/test/rss.test.js b/packages/astro-rss/test/rss.test.js index 2d5a0f6c810b..764cc1301b32 100644 --- a/packages/astro-rss/test/rss.test.js +++ b/packages/astro-rss/test/rss.test.js @@ -19,17 +19,18 @@ import { // note: I spent 30 minutes looking for a nice node-based snapshot tool // ...and I gave up. Enjoy big strings! -// prettier-ignore + +// biome-ignore format: keep in one line const validXmlResult = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItem.title}]]>${site}${phpFeedItem.link}/${site}${phpFeedItem.link}/${new Date(phpFeedItem.pubDate).toUTCString()}<![CDATA[${web1FeedItem.title}]]>${site}${web1FeedItem.link}/${site}${web1FeedItem.link}/${new Date(web1FeedItem.pubDate).toUTCString()}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithContentResult = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItemWithContent.title}]]>${site}${phpFeedItemWithContent.link}/${site}${phpFeedItemWithContent.link}/${new Date(phpFeedItemWithContent.pubDate).toUTCString()}<![CDATA[${web1FeedItemWithContent.title}]]>${site}${web1FeedItemWithContent.link}/${site}${web1FeedItemWithContent.link}/${new Date(web1FeedItemWithContent.pubDate).toUTCString()}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlResultWithAllData = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItem.title}]]>${site}${phpFeedItem.link}/${site}${phpFeedItem.link}/${new Date(phpFeedItem.pubDate).toUTCString()}<![CDATA[${web1FeedItemWithAllData.title}]]>${site}${web1FeedItemWithAllData.link}/${site}${web1FeedItemWithAllData.link}/${new Date(web1FeedItemWithAllData.pubDate).toUTCString()}${web1FeedItemWithAllData.categories[0]}${web1FeedItemWithAllData.categories[1]}${web1FeedItemWithAllData.author}${web1FeedItemWithAllData.commentsUrl}${web1FeedItemWithAllData.source.title}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithCustomDataResult = `<![CDATA[${title}]]>${site}/<![CDATA[${phpFeedItemWithCustomData.title}]]>${site}${phpFeedItemWithCustomData.link}/${site}${phpFeedItemWithCustomData.link}/${new Date(phpFeedItemWithCustomData.pubDate).toUTCString()}${phpFeedItemWithCustomData.customData}<![CDATA[${web1FeedItemWithContent.title}]]>${site}${web1FeedItemWithContent.link}/${site}${web1FeedItemWithContent.link}/${new Date(web1FeedItemWithContent.pubDate).toUTCString()}`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithStylesheet = `<![CDATA[${title}]]>${site}/`; -// prettier-ignore +// biome-ignore format: keep in one line const validXmlWithXSLStylesheet = `<![CDATA[${title}]]>${site}/`; function assertXmlDeepEqual(a, b) { diff --git a/packages/astro/astro-jsx.d.ts b/packages/astro/astro-jsx.d.ts index 08a6c7fba92d..7c2846efc076 100644 --- a/packages/astro/astro-jsx.d.ts +++ b/packages/astro/astro-jsx.d.ts @@ -9,8 +9,6 @@ * Adapted from React’s TypeScript definition from DefinitelyTyped. * @see https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts */ -// BUG! Prettier 3.0 removes `declare`: https://github.com/prettier/prettier/issues/15207 -// prettier-ignore declare namespace astroHTML.JSX { export type Child = Node | Node[] | string | number | boolean | null | undefined | unknown; export type Children = Child | Child[]; diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index a695ab2b7d2e..21630ec1e2e9 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1496,9 +1496,8 @@ export interface AstroUserConfig { * Controls the routing strategy to determine your site URLs. Set this based on your folder/URL path configuration for your default language. * */ - // prettier-ignore - routing?: - { + routing?: + | { /** * @docs * @name i18n.routing.prefixDefaultLocale @@ -1515,18 +1514,18 @@ export interface AstroUserConfig { * When `true`, all URLs will display a language prefix. * URLs will be of the form `example.com/[locale]/content/` for every route, including the default language. * Localized folders are used for every language, including the default. - * - * ```js - * export default defineConfig({ - * i18n: { - * defaultLocale: "en", - * locales: ["en", "fr", "pt-br", "es"], - * routing: { - * prefixDefaultLocale: true, - * } - * } - * }) - * ``` + * + * ```js + * export default defineConfig({ + * i18n: { + * defaultLocale: "en", + * locales: ["en", "fr", "pt-br", "es"], + * routing: { + * prefixDefaultLocale: true, + * } + * } + * }) + * ``` */ prefixDefaultLocale?: boolean; @@ -1569,32 +1568,32 @@ export interface AstroUserConfig { * - `"pathname": The strategy is applied to the pathname of the URLs */ strategy?: 'pathname'; - } | - /** - * - * @docs - * @name i18n.routing.manual - * @kind h4 - * @type {string} - * @version 4.6.0 - * @description - * When this option is enabled, Astro will **disable** its i18n middleware so that you can implement your own custom logic. No other `routing` options (e.g. `prefixDefaultLocale`) may be configured with `routing: "manual"`. - * - * You will be responsible for writing your own routing logic, or executing Astro's i18n middleware manually alongside your own. - * - * ```js - * export default defineConfig({ - * i18n: { - * defaultLocale: "en", - * locales: ["en", "fr", "pt-br", "es"], - * routing: { - * prefixDefaultLocale: true, - * } - * } - * }) - * ``` - */ - 'manual'; + } + /** + * + * @docs + * @name i18n.routing.manual + * @kind h4 + * @type {string} + * @version 4.6.0 + * @description + * When this option is enabled, Astro will **disable** its i18n middleware so that you can implement your own custom logic. No other `routing` options (e.g. `prefixDefaultLocale`) may be configured with `routing: "manual"`. + * + * You will be responsible for writing your own routing logic, or executing Astro's i18n middleware manually alongside your own. + * + * ```js + * export default defineConfig({ + * i18n: { + * defaultLocale: "en", + * locales: ["en", "fr", "pt-br", "es"], + * routing: { + * prefixDefaultLocale: true, + * } + * } + * }) + * ``` + */ + | 'manual'; /** * @name i18n.domains diff --git a/packages/astro/src/assets/vite-plugin-assets.ts b/packages/astro/src/assets/vite-plugin-assets.ts index a696e5619e15..03a9bef29fad 100644 --- a/packages/astro/src/assets/vite-plugin-assets.ts +++ b/packages/astro/src/assets/vite-plugin-assets.ts @@ -147,7 +147,9 @@ export default function assets({ : settings.config.outDir ) )}); - export const assetsDir = /* #__PURE__ */ new URL(${JSON.stringify(settings.config.build.assets)}, outDir); + export const assetsDir = /* #__PURE__ */ new URL(${JSON.stringify( + settings.config.build.assets + )}, outDir); export const getImage = async (options) => await getImageInternal(options, imageConfig); `; } diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts index 7c8601e48a8c..c84356cdb72d 100644 --- a/packages/astro/src/cli/install-package.ts +++ b/packages/astro/src/cli/install-package.ts @@ -39,7 +39,9 @@ export async function getPackage( return packageImport as T; } catch (e) { if (options.optional) return undefined; - let message = `To continue, Astro requires the following dependency to be installed: ${bold(packageName)}.`; + let message = `To continue, Astro requires the following dependency to be installed: ${bold( + packageName + )}.`; if (ci.isCI) { message += ` Packages cannot be installed automatically in CI environments.`; diff --git a/packages/astro/src/core/errors/dev/utils.ts b/packages/astro/src/core/errors/dev/utils.ts index f5de83de4758..c151b55cd712 100644 --- a/packages/astro/src/core/errors/dev/utils.ts +++ b/packages/astro/src/core/errors/dev/utils.ts @@ -171,7 +171,9 @@ function collectInfoFromStacktrace(error: SSRError & { stack: string }): StackIn error.pluginCode || error.id || // TODO: this could be better, `src` might be something else - stackText.split('\n').find((ln) => ln.includes('src') || ln.includes('node_modules')); + stackText + .split('\n') + .find((ln) => ln.includes('src') || ln.includes('node_modules')); // Disable eslint as we're not sure how to improve this regex yet // eslint-disable-next-line regexp/no-super-linear-backtracking const source = possibleFilePath?.replace?.(/^[^(]+\(([^)]+).*$/, '$1').replace(/^\s+at\s+/, ''); diff --git a/packages/astro/src/core/errors/errors-data.ts b/packages/astro/src/core/errors/errors-data.ts index 6cb22cc00e99..e2593e6f1288 100644 --- a/packages/astro/src/core/errors/errors-data.ts +++ b/packages/astro/src/core/errors/errors-data.ts @@ -168,9 +168,7 @@ export const NoMatchingRenderer = { ${ validRenderersCount > 0 - ? `There ${plural ? 'are' : 'is'} ${validRenderersCount} renderer${ - plural ? 's' : '' - } configured in your \`astro.config.mjs\` file, + ? `There ${plural ? 'are' : 'is'} ${validRenderersCount} renderer${plural ? 's' : ''} configured in your \`astro.config.mjs\` file, but ${plural ? 'none were' : 'it was not'} able to server-side render \`${componentName}\`.` : `No valid renderer was found ${ componentExtension diff --git a/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts b/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts index 4f7dc14ce696..eb97bd34e84b 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts @@ -195,8 +195,9 @@ export default { if (placement === settings.config[setting.settingKey]) { option.selected = true; } - option.textContent = - `${placement.slice(0, 1).toUpperCase()}${placement.slice(1)}`.replace('-', ' '); + option.textContent = `${placement.slice(0, 1).toUpperCase()}${placement.slice( + 1 + )}`.replace('-', ' '); astroSelect.append(option); }); astroSelect.element.addEventListener('change', setting.changeEvent); diff --git a/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts b/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts index 278bd0966723..2fe3a8f8f02e 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/toolbar.ts @@ -256,7 +256,9 @@ export class AstroDevToolbar extends HTMLElement { width: 1px; } -
+
@@ -281,7 +283,9 @@ export class AstroDevToolbar extends HTMLElement { : '' }
- ${this.getAppTemplate(this.apps.find((app) => app.builtIn && app.id === 'astro:settings')!)} + ${this.getAppTemplate( + this.apps.find((app) => app.builtIn && app.id === 'astro:settings')! + )}
diff --git a/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts b/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts index b574abd91875..062d683715a2 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/ui-library/tooltip.ts @@ -138,7 +138,11 @@ export class DevToolbarTooltip extends HTMLElement { : '' } ${section.content ? `
${section.content}
` : ''} - ${section.clickDescription ? `${section.clickDescription}` : ''} + ${ + section.clickDescription + ? `${section.clickDescription}` + : '' + } `; fragment.append(sectionElement); diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts index e0ffb4d7eef4..5766656f471d 100644 --- a/packages/astro/src/transitions/router.ts +++ b/packages/astro/src/transitions/router.ts @@ -482,7 +482,7 @@ async function transition( preparationEvent.sourceElement instanceof HTMLFormElement ? preparationEvent.sourceElement : preparationEvent.sourceElement instanceof HTMLElement && - 'form' in preparationEvent.sourceElement + 'form' in preparationEvent.sourceElement ? (preparationEvent.sourceElement.form as HTMLFormElement) : preparationEvent.sourceElement?.closest('form'); // Form elements without enctype explicitly set default to application/x-www-form-urlencoded. diff --git a/packages/astro/test/test-adapter.js b/packages/astro/test/test-adapter.js index 72c5e0c0f0c9..bdfffc83c4ee 100644 --- a/packages/astro/test/test-adapter.js +++ b/packages/astro/test/test-adapter.js @@ -52,7 +52,11 @@ export default function ( return new Response(data); } - ${provideAddress ? `request[Symbol.for('astro.clientAddress')] = '0.0.0.0';` : ''} + ${ + provideAddress + ? `request[Symbol.for('astro.clientAddress')] = '0.0.0.0';` + : '' + } return super.render(request, routeData, locals); } } diff --git a/packages/db/src/core/errors.ts b/packages/db/src/core/errors.ts index 620b2b985fbf..655cbbf380a7 100644 --- a/packages/db/src/core/errors.ts +++ b/packages/db/src/core/errors.ts @@ -35,8 +35,7 @@ export const RENAME_COLUMN_ERROR = (oldSelector: string, newSelector: string) => ); }; -export const FILE_NOT_FOUND_ERROR = (path: string) => - `${red('▶ File not found:')} ${bold(path)}\n`; +export const FILE_NOT_FOUND_ERROR = (path: string) => `${red('▶ File not found:')} ${bold(path)}\n`; export const SHELL_QUERY_MISSING_ERROR = `${red( '▶ Please provide a query to execute using the --query flag.' diff --git a/packages/db/src/core/schemas.ts b/packages/db/src/core/schemas.ts index 4dff9039ae2f..a2a8368fbfb6 100644 --- a/packages/db/src/core/schemas.ts +++ b/packages/db/src/core/schemas.ts @@ -133,7 +133,9 @@ export const dateColumnSchema = z.object({ .union([ sqlSchema, // transform to ISO string for serialization - z.date().transform((d) => d.toISOString()), + z + .date() + .transform((d) => d.toISOString()), ]) .optional(), }), diff --git a/packages/upgrade/src/actions/context.ts b/packages/upgrade/src/actions/context.ts index f89095e7b2bb..775c552c0d22 100644 --- a/packages/upgrade/src/actions/context.ts +++ b/packages/upgrade/src/actions/context.ts @@ -39,7 +39,11 @@ export async function getContext(argv: string[]): Promise { ); const packageManager = detectPackageManager()?.name ?? 'npm'; - const { _: [version = 'latest'] = [], '--help': help = false, '--dry-run': dryRun } = flags; + const { + _: [version = 'latest'] = [], + '--help': help = false, + '--dry-run': dryRun, + } = flags; return { help, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2eeba9ac48e6..cf98a10d4196 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ importers: specifier: ^0.5.8 version: 0.5.10(prettier-plugin-astro@0.12.3)(prettier@3.2.5)(typescript@5.2.2) '@biomejs/biome': - specifier: 1.5.3 - version: 1.5.3 + specifier: 1.6.4 + version: 1.6.4 '@changesets/changelog-github': specifier: ^0.4.8 version: 0.4.8 @@ -6120,88 +6120,88 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@biomejs/biome@1.5.3: - resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==} - engines: {node: '>=14.*'} + /@biomejs/biome@1.6.4: + resolution: {integrity: sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==} + engines: {node: '>=14.21.3'} hasBin: true requiresBuild: true optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.5.3 - '@biomejs/cli-darwin-x64': 1.5.3 - '@biomejs/cli-linux-arm64': 1.5.3 - '@biomejs/cli-linux-arm64-musl': 1.5.3 - '@biomejs/cli-linux-x64': 1.5.3 - '@biomejs/cli-linux-x64-musl': 1.5.3 - '@biomejs/cli-win32-arm64': 1.5.3 - '@biomejs/cli-win32-x64': 1.5.3 - dev: true - - /@biomejs/cli-darwin-arm64@1.5.3: - resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==} - engines: {node: '>=14.*'} + '@biomejs/cli-darwin-arm64': 1.6.4 + '@biomejs/cli-darwin-x64': 1.6.4 + '@biomejs/cli-linux-arm64': 1.6.4 + '@biomejs/cli-linux-arm64-musl': 1.6.4 + '@biomejs/cli-linux-x64': 1.6.4 + '@biomejs/cli-linux-x64-musl': 1.6.4 + '@biomejs/cli-win32-arm64': 1.6.4 + '@biomejs/cli-win32-x64': 1.6.4 + dev: true + + /@biomejs/cli-darwin-arm64@1.6.4: + resolution: {integrity: sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@biomejs/cli-darwin-x64@1.5.3: - resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==} - engines: {node: '>=14.*'} + /@biomejs/cli-darwin-x64@1.6.4: + resolution: {integrity: sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-arm64-musl@1.5.3: - resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-arm64-musl@1.6.4: + resolution: {integrity: sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-arm64@1.5.3: - resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-arm64@1.6.4: + resolution: {integrity: sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-x64-musl@1.5.3: - resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-x64-musl@1.6.4: + resolution: {integrity: sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-x64@1.5.3: - resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==} - engines: {node: '>=14.*'} + /@biomejs/cli-linux-x64@1.6.4: + resolution: {integrity: sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-win32-arm64@1.5.3: - resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==} - engines: {node: '>=14.*'} + /@biomejs/cli-win32-arm64@1.6.4: + resolution: {integrity: sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@biomejs/cli-win32-x64@1.5.3: - resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==} - engines: {node: '>=14.*'} + /@biomejs/cli-win32-x64@1.6.4: + resolution: {integrity: sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] requiresBuild: true diff --git a/prettier.config.js b/prettier.config.js index b28486608061..4c9969429196 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -9,7 +9,7 @@ export default { plugins: ['prettier-plugin-astro'], overrides: [ { - files: ['.*', '*.json', '*.md', '*.toml', '*.yml'], + files: ['.*', '*.md', '*.toml', '*.yml'], options: { useTabs: false, }, From d71a05d4ad61214dd078c617ce59c4b1aab03497 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 17 Apr 2024 08:38:53 +0000 Subject: [PATCH 82/96] [ci] format --- packages/astro/components/Image.astro | 2 +- packages/astro/components/Picture.astro | 2 +- .../e2e/fixtures/astro-component/src/pages/index.astro | 2 +- .../astro/e2e/fixtures/client-only/src/pages/index.astro | 4 ++-- .../fixtures/hydration-race/src/components/Wrapper.astro | 2 +- .../e2e/fixtures/lit-component/src/pages/index.astro | 2 +- .../fixtures/multiple-frameworks/src/pages/index.astro | 8 ++++---- .../e2e/fixtures/nested-in-preact/src/pages/index.astro | 4 ++-- .../e2e/fixtures/nested-in-react/src/pages/index.astro | 4 ++-- .../e2e/fixtures/nested-in-solid/src/pages/index.astro | 4 ++-- .../e2e/fixtures/nested-in-svelte/src/pages/index.astro | 4 ++-- .../e2e/fixtures/nested-in-vue/src/pages/index.astro | 4 ++-- .../e2e/fixtures/nested-recursive/src/pages/index.astro | 4 ++-- packages/astro/e2e/fixtures/pass-js/src/pages/index.astro | 2 +- .../e2e/fixtures/solid-recurse/src/pages/index.astro | 2 +- .../astro/e2e/fixtures/tailwindcss/src/pages/index.astro | 4 ++-- .../view-transitions/src/components/ClickToNavigate.jsx | 2 +- .../fixtures/view-transitions/src/pages/client-load.astro | 2 +- .../view-transitions/src/pages/client-only-four.astro | 4 ++-- .../view-transitions/src/pages/client-only-one.astro | 2 +- .../view-transitions/src/pages/client-only-three.astro | 4 ++-- .../view-transitions/src/pages/client-only-two.astro | 2 +- .../view-transitions/src/pages/inline-script-one.astro | 2 +- .../view-transitions/src/pages/inline-script-two.astro | 2 +- .../fixtures/view-transitions/src/pages/island-one.astro | 2 +- .../fixtures/view-transitions/src/pages/island-two.astro | 2 +- .../e2e/fixtures/vue-component/src/pages/index.astro | 4 ++-- packages/astro/e2e/nested-recursive.test.js | 2 +- .../performance/fixtures/mdoc/src/ContentRenderer.astro | 2 +- .../performance/fixtures/mdx/src/ContentRenderer.astro | 2 +- packages/astro/src/assets/endpoint/generic.ts | 4 ++-- packages/astro/src/assets/endpoint/node.ts | 4 ++-- packages/astro/src/core/build/plugin.ts | 2 +- packages/astro/src/core/build/plugins/plugin-css.ts | 2 +- packages/astro/src/core/build/plugins/util.ts | 2 +- packages/astro/src/core/config/schema.ts | 2 +- packages/astro/src/core/logger/vite.ts | 2 +- .../astro/src/runtime/client/dev-toolbar/entrypoint.ts | 4 ++-- packages/astro/src/vite-plugin-astro/index.ts | 2 +- packages/astro/src/vite-plugin-config-alias/index.ts | 2 +- packages/astro/test/fixtures/0-css/src/pages/index.astro | 6 +++--- .../alias-tsconfig-baseurl-only/src/pages/index.astro | 4 ++-- .../test/fixtures/alias-tsconfig/src/pages/index.astro | 6 +++--- .../fixtures/astro-check-errors/src/pages/index.astro | 2 +- .../test/fixtures/astro-children/src/pages/markup.astro | 2 +- .../test/fixtures/astro-children/src/pages/multiple.astro | 2 +- .../test/fixtures/astro-children/src/pages/strings.astro | 2 +- .../test/fixtures/astro-client-only/src/pages/index.astro | 2 +- .../astro/test/fixtures/astro-jsx/src/pages/index.astro | 2 +- .../test/fixtures/astro-partial-html/src/pages/head.astro | 2 +- .../test/fixtures/astro-partial-html/src/pages/jsx.astro | 2 +- .../astro-slots-nested/src/pages/hidden-nested.astro | 2 +- .../src/pages/server-component-nested.astro | 6 +++--- .../astro-slots/src/pages/slottedapi-render.astro | 2 +- .../content-collection-references/src/pages/welcome.astro | 2 +- .../content-collections/src/pages/collections.json.js | 2 +- .../content-collections/src/pages/entries.json.js | 2 +- .../core-image-deletion/src/pages/blog/[slug].astro | 2 +- .../fixtures/core-image/src/pages/blog/[...slug].astro | 2 +- .../fixtures/css-import-as-inline/src/pages/index.astro | 2 +- .../fixtures/css-inline-stylesheets/src/pages/index.astro | 2 +- .../fixtures/css-order-import/src/pages/component.astro | 2 +- .../test/fixtures/css-order-import/src/pages/dedupe.astro | 2 +- .../test/fixtures/css-order-import/src/pages/index.astro | 2 +- .../test/fixtures/css-order-layout/src/layouts/Main.astro | 2 +- .../fixtures/css-order-layout/src/layouts/Second.astro | 2 +- packages/astro/test/fixtures/fetch/src/pages/index.astro | 2 +- .../fixtures/fontsource-package/src/pages/index.astro | 2 +- .../head-injection/src/pages/with-slot-in-slot.astro | 2 +- .../head-injection/src/pages/with-slot-render.astro | 2 +- .../astro/test/fixtures/html-slots/src/pages/index.astro | 2 +- .../fixtures/hydration-race/src/components/Wrapper.astro | 2 +- .../test/fixtures/hydration-race/src/pages/index.astro | 2 +- .../fixtures/i18n-routing-subdomain/src/pages/index.astro | 2 +- .../fixtures/i18n-routing/src/pages/virtual-module.astro | 2 +- .../astro/test/fixtures/jsx/src/pages/frameworks.astro | 8 ++++---- .../fixtures/multiple-renderers/src/pages/index.astro | 2 +- .../test/fixtures/preact-component/src/pages/fn.astro | 2 +- .../fixtures/preact-component/src/pages/signals.astro | 2 +- .../test/fixtures/react-jsx-export/src/pages/index.astro | 2 +- .../routing-priority/src/pages/[lang]/[...catchall].astro | 2 +- .../routing-priority/src/pages/[lang]/index.astro | 2 +- .../test/fixtures/routing-priority/src/pages/[page].astro | 2 +- .../test/fixtures/routing-priority/src/pages/[slug].astro | 2 +- .../routing-priority/src/pages/posts/[...slug].astro | 2 +- .../fixtures/routing-priority/src/pages/posts/[pid].astro | 2 +- .../test/fixtures/solid-component/src/pages/index.astro | 6 +++--- .../solid-component/src/pages/ssr-client-none.astro | 2 +- .../src/pages/index.astro | 4 ++-- .../test/fixtures/static-build/src/pages/hoisted.astro | 2 +- .../test/fixtures/static-build/src/pages/index.astro | 2 +- .../astro/test/fixtures/streaming/src/pages/index.astro | 2 +- packages/create-astro/src/messages.ts | 2 +- packages/db/test/fixtures/basics/db/config.ts | 2 +- packages/db/test/fixtures/basics/db/seed.ts | 2 +- packages/db/test/fixtures/basics/src/pages/index.astro | 2 +- packages/db/test/fixtures/basics/src/pages/login.astro | 2 +- packages/db/test/fixtures/basics/src/pages/run.json.ts | 2 +- packages/db/test/fixtures/db-in-src/db/seed.ts | 2 +- packages/db/test/fixtures/db-in-src/pages/index.astro | 2 +- .../src/pages/foreign-key-constraint.json.ts | 2 +- .../test/fixtures/integration-only/integration/config.ts | 2 +- .../db/test/fixtures/integration-only/integration/seed.ts | 2 +- .../db/test/fixtures/integrations/integration/config.ts | 2 +- .../db/test/fixtures/integrations/integration/seed.ts | 2 +- packages/db/test/fixtures/local-prod/db/seed.ts | 2 +- .../db/test/fixtures/local-prod/src/pages/index.astro | 2 +- .../db/test/fixtures/no-apptoken/src/pages/index.astro | 2 +- packages/db/test/fixtures/recipes/src/pages/index.astro | 2 +- .../fixtures/ticketing-example/src/components/Form.tsx | 2 +- .../ticketing-example/src/pages/[event]/_Ticket.tsx | 2 +- packages/integrations/lit/server-shim.js | 2 +- packages/integrations/markdoc/src/content-entry-type.ts | 2 +- .../integrations/markdoc/src/runtime-assets-config.ts | 4 ++-- .../content-collections/src/pages/collection.json.js | 2 +- .../fixtures/content-collections/src/pages/entry.json.js | 2 +- .../test/fixtures/headings-custom/src/pages/[slug].astro | 2 +- .../markdoc/test/fixtures/headings/src/pages/[slug].astro | 2 +- .../test/fixtures/image-assets/src/components/Image.astro | 2 +- .../test/fixtures/render-html/src/pages/[slug].astro | 2 +- .../fixtures/css-head-mdx/src/pages/posts/[post].astro | 2 +- .../mdx/test/fixtures/css-head-mdx/src/pages/remote.astro | 6 +++--- .../test/fixtures/mdx-images/src/components/MyImage.astro | 2 +- .../test/fixtures/mdx-images/src/pages/esm-import.astro | 2 +- .../mdx/test/fixtures/mdx-optimize/src/pages/import.astro | 2 +- packages/integrations/react/server.js | 2 +- .../test/fixtures/react-component/src/pages/index.astro | 8 ++++---- packages/integrations/vue/client.js | 2 +- packages/integrations/vue/server.js | 2 +- .../test/fixtures/app-entrypoint/src/pages/index.astro | 2 +- .../vue/test/fixtures/basics/src/pages/index.astro | 2 +- packages/markdown/remark/src/frontmatter-injection.ts | 2 +- packages/telemetry/src/system-info.ts | 2 +- 133 files changed, 169 insertions(+), 169 deletions(-) diff --git a/packages/astro/components/Image.astro b/packages/astro/components/Image.astro index aee198a60278..4e55f5608b8e 100644 --- a/packages/astro/components/Image.astro +++ b/packages/astro/components/Image.astro @@ -1,5 +1,5 @@ --- -import { getImage, type LocalImageProps, type RemoteImageProps } from 'astro:assets'; +import { type LocalImageProps, type RemoteImageProps, getImage } from 'astro:assets'; import { AstroError, AstroErrorData } from '../dist/core/errors/index.js'; import type { HTMLAttributes } from '../types'; diff --git a/packages/astro/components/Picture.astro b/packages/astro/components/Picture.astro index 6dcc50c8e1d6..3984a53e96cb 100644 --- a/packages/astro/components/Picture.astro +++ b/packages/astro/components/Picture.astro @@ -1,5 +1,5 @@ --- -import { getImage, type LocalImageProps, type RemoteImageProps } from 'astro:assets'; +import { type LocalImageProps, type RemoteImageProps, getImage } from 'astro:assets'; import type { GetImageResult, ImageOutputFormat } from '../dist/@types/astro'; import { isESMImportedImage, resolveSrc } from '../dist/assets/utils/imageKind'; import { AstroError, AstroErrorData } from '../dist/core/errors/index.js'; diff --git a/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro b/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro index 3ada093e7d21..04cb1c110c88 100644 --- a/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/astro-component/src/pages/index.astro @@ -1,7 +1,7 @@ --- -import Hero from '../components/Hero.astro'; import LinkedLib from '@e2e/astro-linked-lib' import HoistedScript from '@e2e/astro-linked-lib/HoistedScript' +import Hero from '../components/Hero.astro'; --- diff --git a/packages/astro/e2e/fixtures/client-only/src/pages/index.astro b/packages/astro/e2e/fixtures/client-only/src/pages/index.astro index d8b30b9cf099..a80bddc0eb0e 100644 --- a/packages/astro/e2e/fixtures/client-only/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/client-only/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import * as react from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.jsx'; +import * as react from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.jsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro b/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro index a3de9b8ecc6b..9a914d8fb333 100644 --- a/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro +++ b/packages/astro/e2e/fixtures/hydration-race/src/components/Wrapper.astro @@ -1,6 +1,6 @@ --- -import One from './One.jsx'; import Deeper from './Deeper.astro'; +import One from './One.jsx'; --- diff --git a/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro b/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro index 43eb17a4ecb9..1d9511057b4a 100644 --- a/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/lit-component/src/pages/index.astro @@ -1,7 +1,7 @@ --- +import ClientOnlyComponent from '../components/ClientOnlyComponent.js'; import MyCounter from '../components/Counter.js'; import NonDeferredCounter from '../components/NonDeferredCounter.js'; -import ClientOnlyComponent from '../components/ClientOnlyComponent.js'; const someProps = { count: 10, diff --git a/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro b/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro index ded58d8aa188..55b2108cbe9c 100644 --- a/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/multiple-frameworks/src/pages/index.astro @@ -1,13 +1,13 @@ --- -// Style Imports -import '../styles/global.css'; // Component Imports import { A, B as Renamed } from '../components'; -import * as react from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import * as react from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; +// Style Imports +import '../styles/global.css'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro index 19ab5042757b..962f8f038599 100644 --- a/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-preact/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import ReactCounter from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import ReactCounter from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro index 1ab459f743ce..9fb5b4862838 100644 --- a/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-react/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import ReactCounter from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import ReactCounter from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro index 91552a8367ca..c4af890a0aa0 100644 --- a/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-solid/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro index 5648a25814c6..b1b8187d52e7 100644 --- a/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-svelte/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro index ea0a88f84da3..f8e74ff78642 100644 --- a/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-in-vue/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import { PreactCounter } from '../components/preact/PreactCounter.tsx'; +import { Counter as ReactCounter } from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; // Full Astro Component Syntax: // https://docs.astro.build/basics/astro-components/ diff --git a/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro b/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro index a17337c897fd..4b180602db0e 100644 --- a/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/nested-recursive/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import ReactCounter from '../components/react/ReactCounter.jsx'; import PreactCounter from '../components/preact/PreactCounter.tsx'; +import ReactCounter from '../components/react/ReactCounter.jsx'; import SolidCounter from '../components/solid/SolidCounter.tsx'; -import VueCounter from '../components/vue/VueCounter.vue'; import SvelteCounter from '../components/svelte/SvelteCounter.svelte'; +import VueCounter from '../components/vue/VueCounter.vue'; --- diff --git a/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro b/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro index 181f2bfba31c..24794367f30d 100644 --- a/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/pass-js/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import type { BigNestedObject } from '../types'; import Component from '../components/React'; +import type { BigNestedObject } from '../types'; const object: BigNestedObject = { nested: { diff --git a/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro b/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro index 7aeca1aef258..b67eb81ced15 100644 --- a/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/solid-recurse/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import WrapperB from "../components/WrapperB.jsx"; import WrapperA from "../components/WrapperA.jsx"; +import WrapperB from "../components/WrapperB.jsx"; --- diff --git a/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro b/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro index 948fa51df036..65bff4d4a388 100644 --- a/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/tailwindcss/src/pages/index.astro @@ -1,8 +1,8 @@ --- -// Component Imports -import Layout from '../components/Layout.astro'; import Button from '../components/Button.astro'; import Complex from '../components/Complex.astro'; +// Component Imports +import Layout from '../components/Layout.astro'; --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx b/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx index db8cc25f3a95..2d14d42a6952 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx +++ b/packages/astro/e2e/fixtures/view-transitions/src/components/ClickToNavigate.jsx @@ -1,5 +1,5 @@ -import React from 'react'; import { navigate } from "astro:transitions/client"; +import React from 'react'; export default function ClickToNavigate({ to, id }) { return ; } diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro index f24d216be9d8..0eaff1165ceb 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-load.astro @@ -1,6 +1,6 @@ --- -import ClickToNavigate from "../components/ClickToNavigate.jsx" import { ViewTransitions } from "astro:transitions"; +import ClickToNavigate from "../components/ClickToNavigate.jsx" --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro index 9ebfa65f04e8..569a24b1a4f8 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-four.astro @@ -1,8 +1,8 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; -import VueCounter from '../components/VueCounter.vue'; +import Layout from '../components/Layout.astro'; import SvelteCounter from '../components/SvelteCounter.svelte'; +import VueCounter from '../components/VueCounter.vue'; ---

Page 4

diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro index a51ccc299b2a..1a9b731bf62f 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-one.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; +import Layout from '../components/Layout.astro'; ---
go to page 2 diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro index 34fa6992699b..83fcd4e1820d 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-three.astro @@ -1,8 +1,8 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; -import VueCounter from '../components/VueCounter.vue'; +import Layout from '../components/Layout.astro'; import SvelteCounter from '../components/SvelteCounter.svelte'; +import VueCounter from '../components/VueCounter.vue'; ---
go to page 4 diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro index 4190d86efb45..2175ffd0b1ef 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/client-only-two.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island'; +import Layout from '../components/Layout.astro'; ---

Page 2

diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro index e887fe6a5e77..bd59d22cfd50 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-one.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import InlineScript from '../components/InlineScript.astro'; +import Layout from '../components/Layout.astro'; --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro index 430ad946517e..2becd8d1ccd3 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/inline-script-two.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import InlineScript from '../components/InlineScript.astro'; +import Layout from '../components/Layout.astro'; --- diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro index 883d567a118f..533ac408891a 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-one.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island.jsx'; +import Layout from '../components/Layout.astro'; export const prerender = false; const persistProps = Astro.url.searchParams.has('persist'); diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro index 37912591cb57..c76ee14521a3 100644 --- a/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/island-two.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Island from '../components/Island.jsx'; +import Layout from '../components/Layout.astro'; ---

Page 2

diff --git a/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro b/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro index fb10e60382d8..fd2e8f9b54c1 100644 --- a/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro +++ b/packages/astro/e2e/fixtures/vue-component/src/pages/index.astro @@ -1,8 +1,8 @@ --- import Counter from '../components/Counter.vue'; -import VueComponent from '../components/VueComponent.vue'; -import AsyncTest from '../components/Test.vue' import State from '../components/State.vue' +import AsyncTest from '../components/Test.vue' +import VueComponent from '../components/VueComponent.vue'; const someProps = { count: 0, diff --git a/packages/astro/e2e/nested-recursive.test.js b/packages/astro/e2e/nested-recursive.test.js index 8271c6557587..262cd67723e9 100644 --- a/packages/astro/e2e/nested-recursive.test.js +++ b/packages/astro/e2e/nested-recursive.test.js @@ -1,4 +1,4 @@ -import { expect, test as base } from '@playwright/test'; +import { test as base, expect } from '@playwright/test'; import { loadFixture, waitForHydrate } from './test-utils.js'; const test = base.extend({ diff --git a/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro b/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro index 3008f611979e..fbe086bc27fb 100644 --- a/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro +++ b/packages/astro/performance/fixtures/mdoc/src/ContentRenderer.astro @@ -1,6 +1,6 @@ --- -import { Heading, Aside, LikeButton, HydratedLikeButton } from '@performance/utils'; import type { CollectionEntry } from 'astro:content'; +import { Aside, Heading, HydratedLikeButton, LikeButton } from '@performance/utils'; type Props = { entry: CollectionEntry<'generated'>; diff --git a/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro b/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro index 42c2da57a1c1..6c40fe40e6a8 100644 --- a/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro +++ b/packages/astro/performance/fixtures/mdx/src/ContentRenderer.astro @@ -1,6 +1,6 @@ --- -import Title from './Title.astro'; import type { CollectionEntry } from 'astro:content'; +import Title from './Title.astro'; type Props = { entry: CollectionEntry<'generated'>; diff --git a/packages/astro/src/assets/endpoint/generic.ts b/packages/astro/src/assets/endpoint/generic.ts index 3dd5140cf199..589f9f8b75f1 100644 --- a/packages/astro/src/assets/endpoint/generic.ts +++ b/packages/astro/src/assets/endpoint/generic.ts @@ -1,11 +1,11 @@ +// @ts-expect-error +import { imageConfig } from 'astro:assets'; import { isRemotePath } from '@astrojs/internal-helpers/path'; import mime from 'mime/lite.js'; import type { APIRoute } from '../../@types/astro.js'; import { getConfiguredImageService } from '../internal.js'; import { etag } from '../utils/etag.js'; import { isRemoteAllowed } from '../utils/remotePattern.js'; -// @ts-expect-error -import { imageConfig } from 'astro:assets'; async function loadRemoteImage(src: URL, headers: Headers) { try { diff --git a/packages/astro/src/assets/endpoint/node.ts b/packages/astro/src/assets/endpoint/node.ts index 4d29a7fadd02..1d9ac9df64ce 100644 --- a/packages/astro/src/assets/endpoint/node.ts +++ b/packages/astro/src/assets/endpoint/node.ts @@ -2,6 +2,8 @@ import os from 'node:os'; import { isAbsolute } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; +// @ts-expect-error +import { assetsDir, imageConfig, outDir } from 'astro:assets'; import { isRemotePath, removeQueryString } from '@astrojs/internal-helpers/path'; import { readFile } from 'fs/promises'; import mime from 'mime/lite.js'; @@ -9,8 +11,6 @@ import type { APIRoute } from '../../@types/astro.js'; import { getConfiguredImageService } from '../internal.js'; import { etag } from '../utils/etag.js'; import { isRemoteAllowed } from '../utils/remotePattern.js'; -// @ts-expect-error -import { assetsDir, imageConfig, outDir } from 'astro:assets'; function replaceFileSystemReferences(src: string) { return os.platform().includes('win32') ? src.replace(/^\/@fs\//, '') : src.replace(/^\/@fs/, ''); diff --git a/packages/astro/src/core/build/plugin.ts b/packages/astro/src/core/build/plugin.ts index 68474b0576b7..f16b5a1d9423 100644 --- a/packages/astro/src/core/build/plugin.ts +++ b/packages/astro/src/core/build/plugin.ts @@ -1,4 +1,4 @@ -import type { Plugin as VitePlugin, Rollup } from 'vite'; +import type { Rollup, Plugin as VitePlugin } from 'vite'; import type { BuildInternals } from './internal.js'; import type { StaticBuildOptions, ViteBuildReturn } from './types.js'; diff --git a/packages/astro/src/core/build/plugins/plugin-css.ts b/packages/astro/src/core/build/plugins/plugin-css.ts index 31cb2c9b538a..e0dce339f769 100644 --- a/packages/astro/src/core/build/plugins/plugin-css.ts +++ b/packages/astro/src/core/build/plugins/plugin-css.ts @@ -1,5 +1,5 @@ import type { GetModuleInfo } from 'rollup'; -import type { BuildOptions, Plugin as VitePlugin, ResolvedConfig, Rollup } from 'vite'; +import type { BuildOptions, ResolvedConfig, Rollup, Plugin as VitePlugin } from 'vite'; import { isBuildableCSSRequest } from '../../../vite-plugin-astro-server/util.js'; import type { BuildInternals } from '../internal.js'; import type { AstroBuildPlugin, BuildTarget } from '../plugin.js'; diff --git a/packages/astro/src/core/build/plugins/util.ts b/packages/astro/src/core/build/plugins/util.ts index 0c9636b307a1..d1bd266cd4ab 100644 --- a/packages/astro/src/core/build/plugins/util.ts +++ b/packages/astro/src/core/build/plugins/util.ts @@ -1,5 +1,5 @@ import { extname } from 'node:path'; -import type { BuildOptions, Plugin as VitePlugin, Rollup } from 'vite'; +import type { BuildOptions, Rollup, Plugin as VitePlugin } from 'vite'; // eslint-disable-next-line @typescript-eslint/ban-types type OutputOptionsHook = Extract; diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index d9b91a9ce2c6..303846f7608f 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -1,8 +1,8 @@ import type { + ShikiConfig, RehypePlugin as _RehypePlugin, RemarkPlugin as _RemarkPlugin, RemarkRehype as _RemarkRehype, - ShikiConfig, } from '@astrojs/markdown-remark'; import { markdownConfigDefaults } from '@astrojs/markdown-remark'; import { type BuiltinTheme, bundledThemes } from 'shiki'; diff --git a/packages/astro/src/core/logger/vite.ts b/packages/astro/src/core/logger/vite.ts index 9ddfd92eb33d..317a037826ff 100644 --- a/packages/astro/src/core/logger/vite.ts +++ b/packages/astro/src/core/logger/vite.ts @@ -1,6 +1,6 @@ import { fileURLToPath } from 'url'; import stripAnsi from 'strip-ansi'; -import type { LogLevel, Logger as ViteLogger, Rollup } from 'vite'; +import type { LogLevel, Rollup, Logger as ViteLogger } from 'vite'; import { isAstroError } from '../errors/errors.js'; import { serverShortcuts as formatServerShortcuts } from '../messages.js'; import { type Logger as AstroLogger, isLogLevelEnabled } from './core.js'; diff --git a/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts b/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts index 5a9f3536c13d..49eac68fdb25 100644 --- a/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts +++ b/packages/astro/src/runtime/client/dev-toolbar/entrypoint.ts @@ -1,8 +1,8 @@ +// @ts-expect-error +import { loadDevToolbarApps } from 'astro:dev-toolbar'; import type { DevToolbarApp as DevToolbarAppDefinition } from '../../../@types/astro.js'; import { settings } from './settings.js'; import type { AstroDevToolbar, DevToolbarApp } from './toolbar.js'; -// @ts-expect-error -import { loadDevToolbarApps } from 'astro:dev-toolbar'; let overlay: AstroDevToolbar; diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index bc9dbd5aa449..2f4e256b760b 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -3,9 +3,9 @@ import type * as vite from 'vite'; import type { AstroConfig, AstroSettings } from '../@types/astro.js'; import type { Logger } from '../core/logger/core.js'; import type { - CompileMetadata, PluginCssMetadata as AstroPluginCssMetadata, PluginMetadata as AstroPluginMetadata, + CompileMetadata, } from './types.js'; import { normalizePath } from 'vite'; diff --git a/packages/astro/src/vite-plugin-config-alias/index.ts b/packages/astro/src/vite-plugin-config-alias/index.ts index 7a7949e516ad..a5f4ae53cffa 100644 --- a/packages/astro/src/vite-plugin-config-alias/index.ts +++ b/packages/astro/src/vite-plugin-config-alias/index.ts @@ -1,6 +1,6 @@ import path from 'node:path'; import type { CompilerOptions } from 'typescript'; -import { type Plugin as VitePlugin, type ResolvedConfig, normalizePath } from 'vite'; +import { type ResolvedConfig, type Plugin as VitePlugin, normalizePath } from 'vite'; import type { AstroSettings } from '../@types/astro.js'; type Alias = { diff --git a/packages/astro/test/fixtures/0-css/src/pages/index.astro b/packages/astro/test/fixtures/0-css/src/pages/index.astro index c11fe1166e37..c21f9802532b 100644 --- a/packages/astro/test/fixtures/0-css/src/pages/index.astro +++ b/packages/astro/test/fixtures/0-css/src/pages/index.astro @@ -5,13 +5,16 @@ import AstroComponent from '../components/Astro.astro'; import AstroComponentNone from '../components/AstroNone.astro'; import AstroSass from '../components/AstroSass.astro'; import AstroScss from '../components/AstroScss.astro'; +import ModuleOrdering from '../components/ModuleOrdering.jsx'; import ReactCSS from '../components/ReactCSS.jsx'; +import ReactDynamic from '../components/ReactDynamic.jsx'; import ReactModules from '../components/ReactModules.jsx'; import ReactModulesSass from '../components/ReactModulesSass.jsx'; import ReactModulesScss from '../components/ReactModulesScss.jsx'; import ReactSass from '../components/ReactSass.jsx'; import ReactScss from '../components/ReactScss.jsx'; import SvelteCSS from '../components/SvelteCSS.svelte'; +import SvelteDynamic from '../components/SvelteDynamic.svelte'; import SvelteSass from '../components/SvelteSass.svelte'; import SvelteScss from '../components/SvelteScss.svelte'; import VueCSS from '../components/VueCSS.vue'; @@ -19,9 +22,6 @@ import VueModules from '../components/VueModules.vue'; import VueSass from '../components/VueSass.vue'; import VueScoped from '../components/VueScoped.vue'; import VueScss from '../components/VueScss.vue'; -import ReactDynamic from '../components/ReactDynamic.jsx'; -import SvelteDynamic from '../components/SvelteDynamic.svelte'; -import ModuleOrdering from '../components/ModuleOrdering.jsx'; import '../styles/imported-url.css'; import '../styles/imported.sass'; diff --git a/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro b/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro index e200a95677cd..a654eeb12e7b 100644 --- a/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro +++ b/packages/astro/test/fixtures/alias-tsconfig-baseurl-only/src/pages/index.astro @@ -1,10 +1,10 @@ --- +import Alias from 'components/Alias.svelte'; import Client from 'components/Client.svelte' import Foo from 'components/Foo.astro'; import StyleComp from 'components/Style.astro'; -import Alias from 'components/Alias.svelte'; -import { foo, index } from 'utils/constants'; import 'styles/main.css'; +import { foo, index } from 'utils/constants'; --- diff --git a/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro b/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro index 25faad0ea74f..e880d48440de 100644 --- a/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro +++ b/packages/astro/test/fixtures/alias-tsconfig/src/pages/index.astro @@ -1,11 +1,11 @@ --- +import Alias from '@components/Alias.svelte'; import Client from '@components/Client.svelte' +import '@styles/main.css'; +import { namespace } from '@test/namespace-package' import Foo from 'src/components/Foo.astro'; import StyleComp from 'src/components/Style.astro'; -import Alias from '@components/Alias.svelte'; -import { namespace } from '@test/namespace-package' import { foo, index } from 'src/utils/constants'; -import '@styles/main.css'; const globResult = Object.keys(import.meta.glob('@components/glob/*.js')).join(', ') --- diff --git a/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro b/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro index c161df438c6b..4521e6f25bcc 100644 --- a/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro +++ b/packages/astro/test/fixtures/astro-check-errors/src/pages/index.astro @@ -1,5 +1,5 @@ --- - console.log(doesntExist) +console.log(doesntExist) --- diff --git a/packages/astro/test/fixtures/astro-children/src/pages/markup.astro b/packages/astro/test/fixtures/astro-children/src/pages/markup.astro index b771c24335dc..2cc198bb0dd9 100644 --- a/packages/astro/test/fixtures/astro-children/src/pages/markup.astro +++ b/packages/astro/test/fixtures/astro-children/src/pages/markup.astro @@ -1,7 +1,7 @@ --- import PreactComponent from '../components/Component.jsx'; -import VueComponent from '../components/Component.vue'; import SvelteComponent from '../components/Component.svelte'; +import VueComponent from '../components/Component.vue'; --- Children diff --git a/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro b/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro index 8c2f73a91eb6..41061c0b99e8 100644 --- a/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro +++ b/packages/astro/test/fixtures/astro-children/src/pages/multiple.astro @@ -1,7 +1,7 @@ --- import PreactComponent from '../components/Component.jsx'; -import VueComponent from '../components/Component.vue'; import SvelteComponent from '../components/Component.svelte'; +import VueComponent from '../components/Component.vue'; --- Children diff --git a/packages/astro/test/fixtures/astro-children/src/pages/strings.astro b/packages/astro/test/fixtures/astro-children/src/pages/strings.astro index 10b1a887fc40..f67f29c64bc1 100644 --- a/packages/astro/test/fixtures/astro-children/src/pages/strings.astro +++ b/packages/astro/test/fixtures/astro-children/src/pages/strings.astro @@ -1,7 +1,7 @@ --- import PreactComponent from '../components/Component.jsx'; -import VueComponent from '../components/Component.vue'; import SvelteComponent from '../components/Component.svelte'; +import VueComponent from '../components/Component.vue'; --- Children diff --git a/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro b/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro index bf239197f132..7a7d59b79f00 100644 --- a/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro +++ b/packages/astro/test/fixtures/astro-client-only/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import PersistentCounter from '../components/PersistentCounter.svelte'; import ReactComponent from '../components/JSXComponent.jsx'; +import PersistentCounter from '../components/PersistentCounter.svelte'; --- Client only pages diff --git a/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro b/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro index ccfb2b5a06e3..b4d0785670c1 100644 --- a/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro +++ b/packages/astro/test/fixtures/astro-jsx/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import ReactCounter from '../components/ReactCounter.jsx'; import PreactCounter from '../components/PreactCounter.tsx'; +import ReactCounter from '../components/ReactCounter.jsx'; import SolidCounter from '../components/SolidCounter.jsx'; --- diff --git a/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro b/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro index 635b09699a9f..608394142a5e 100644 --- a/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro +++ b/packages/astro/test/fixtures/astro-partial-html/src/pages/head.astro @@ -1,6 +1,6 @@ --- -import Head from '../components/Head.astro'; import Component from '../components/Component.jsx'; +import Head from '../components/Head.astro'; --- diff --git a/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro b/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro index b5a34f4ceda5..09c0e8eb5251 100644 --- a/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro +++ b/packages/astro/test/fixtures/astro-partial-html/src/pages/jsx.astro @@ -1,6 +1,6 @@ --- -import Layout from '../components/Layout.astro'; import Component from '../components/Component.jsx'; +import Layout from '../components/Layout.astro'; // note: this test requires to be the very first element --- diff --git a/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro b/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro index dcb3ebcba5b6..d3f0417562ce 100644 --- a/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro +++ b/packages/astro/test/fixtures/astro-slots-nested/src/pages/hidden-nested.astro @@ -1,6 +1,6 @@ --- -import Parent from '../components/react/Parent' import Inner from '../components/react/Inner' +import Parent from '../components/react/Parent' --- diff --git a/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro b/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro index ec4ae3158beb..8c256864fd6b 100644 --- a/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro +++ b/packages/astro/test/fixtures/astro-slots-nested/src/pages/server-component-nested.astro @@ -1,9 +1,9 @@ --- -import PassesChildren from '../components/react/PassesChildren.jsx'; -import PassesChildrenP from '../components/preact/PassesChildrenP.jsx'; -import PassesChildrenS from '../components/solid/PassesChildrenS.jsx'; import PassesChildrenSv from '../components/PassesChildrenSv.svelte'; import PassesChildrenV from '../components/PassesChildrenV.vue'; +import PassesChildrenP from '../components/preact/PassesChildrenP.jsx'; +import PassesChildren from '../components/react/PassesChildren.jsx'; +import PassesChildrenS from '../components/solid/PassesChildrenS.jsx'; --- diff --git a/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro b/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro index 8cd31fdd3bed..f383d9e89ae4 100644 --- a/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro +++ b/packages/astro/test/fixtures/astro-slots/src/pages/slottedapi-render.astro @@ -1,7 +1,7 @@ --- import Render from '../components/Render.astro'; -import RenderFn from '../components/RenderFn.astro'; import RenderArgs from '../components/RenderArgs.astro'; +import RenderFn from '../components/RenderFn.astro'; --- diff --git a/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro b/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro index 3645d37bb5b8..e372f5a64ae4 100644 --- a/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro +++ b/packages/astro/test/fixtures/content-collection-references/src/pages/welcome.astro @@ -1,6 +1,6 @@ --- import { Image } from 'astro:assets'; -import { getEntry, getEntries } from 'astro:content'; +import { getEntries, getEntry } from 'astro:content'; const welcomePost = await getEntry('blog', 'welcome'); diff --git a/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js b/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js index 638bbea4dcfa..b7b7d847253e 100644 --- a/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js +++ b/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js @@ -1,6 +1,6 @@ +import { getCollection } from 'astro:content'; import * as devalue from 'devalue'; import { stripAllRenderFn } from '../utils.js'; -import { getCollection } from 'astro:content'; export async function GET() { const withoutConfig = stripAllRenderFn(await getCollection('without-config')); diff --git a/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js b/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js index e0f123076cff..a05a9138b1d8 100644 --- a/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js +++ b/packages/astro/test/fixtures/content-collections/src/pages/entries.json.js @@ -1,6 +1,6 @@ +import { getEntryBySlug } from 'astro:content'; import * as devalue from 'devalue'; import { stripRenderFn } from '../utils.js'; -import { getEntryBySlug } from 'astro:content'; export async function GET() { const columbiaWithoutConfig = stripRenderFn(await getEntryBySlug('without-config', 'columbia')); diff --git a/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro b/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro index 418d449bb64c..63b6eb70e502 100644 --- a/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro +++ b/packages/astro/test/fixtures/core-image-deletion/src/pages/blog/[slug].astro @@ -1,6 +1,6 @@ --- -import type { GetStaticPaths } from "astro"; import { getCollection } from "astro:content"; +import type { GetStaticPaths } from "astro"; export const getStaticPaths = (async () => { const blog = await getCollection("blog"); diff --git a/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro b/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro index 33f96a70da84..dcf329ec423a 100644 --- a/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro +++ b/packages/astro/test/fixtures/core-image/src/pages/blog/[...slug].astro @@ -1,5 +1,5 @@ --- -import { getImage,Image } from 'astro:assets'; +import { Image, getImage} from 'astro:assets'; import { getCollection } from 'astro:content'; export async function getStaticPaths() { diff --git a/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro b/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro index 89a7288ae12a..90838f002be7 100644 --- a/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro +++ b/packages/astro/test/fixtures/css-import-as-inline/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Layout from '../layouts/Layout.astro'; import inline from '../inline.css?inline'; +import Layout from '../layouts/Layout.astro'; import raw from '../raw.css?raw'; --- diff --git a/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro b/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro index bfdbeb5f8e85..2aecfb0f2eb7 100644 --- a/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro +++ b/packages/astro/test/fixtures/css-inline-stylesheets/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Button from '../components/Button.astro'; import { getEntryBySlug } from 'astro:content'; +import Button from '../components/Button.astro'; const entry = await getEntryBySlug('en', 'endeavour'); const { Content } = await entry.render(); diff --git a/packages/astro/test/fixtures/css-order-import/src/pages/component.astro b/packages/astro/test/fixtures/css-order-import/src/pages/component.astro index 1b779d18db03..3d5f2633992b 100644 --- a/packages/astro/test/fixtures/css-order-import/src/pages/component.astro +++ b/packages/astro/test/fixtures/css-order-import/src/pages/component.astro @@ -1,7 +1,7 @@ --- +import Client2 from '../components/Client2.jsx'; import One from '../components/One.astro'; import Two from '../components/Two.astro'; -import Client2 from '../components/Client2.jsx'; --- diff --git a/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro b/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro index ea3a01670665..bbd26ad6b279 100644 --- a/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro +++ b/packages/astro/test/fixtures/css-order-import/src/pages/dedupe.astro @@ -1,6 +1,6 @@ --- -import '../styles/AstroJsx.css'; import Dedupe from '../components/Dedupe.jsx'; +import '../styles/AstroJsx.css'; --- diff --git a/packages/astro/test/fixtures/css-order-import/src/pages/index.astro b/packages/astro/test/fixtures/css-order-import/src/pages/index.astro index 0a6baab59486..6cc9ac708ed0 100644 --- a/packages/astro/test/fixtures/css-order-import/src/pages/index.astro +++ b/packages/astro/test/fixtures/css-order-import/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import '../styles/base.css'; import Client1 from '../components/Client1.jsx'; +import '../styles/base.css'; --- diff --git a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro index 49f378bc641f..225b8c1030ce 100644 --- a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro +++ b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro @@ -1,6 +1,6 @@ --- -import MainHead from "../components/MainHead.astro"; import BlueButton from "../components/BlueButton.astro"; +import MainHead from "../components/MainHead.astro"; --- diff --git a/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro b/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro index 49f378bc641f..225b8c1030ce 100644 --- a/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro +++ b/packages/astro/test/fixtures/css-order-layout/src/layouts/Second.astro @@ -1,6 +1,6 @@ --- -import MainHead from "../components/MainHead.astro"; import BlueButton from "../components/BlueButton.astro"; +import MainHead from "../components/MainHead.astro"; --- diff --git a/packages/astro/test/fixtures/fetch/src/pages/index.astro b/packages/astro/test/fixtures/fetch/src/pages/index.astro index 06a5bd2b3a59..944873d0c5a9 100644 --- a/packages/astro/test/fixtures/fetch/src/pages/index.astro +++ b/packages/astro/test/fixtures/fetch/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Test from '../components/AstroComponent.astro'; import AlreadyImported from '../components/AlreadyImported.astro'; +import Test from '../components/AstroComponent.astro'; import CustomDeclaration from '../components/CustomDeclaration.astro'; import JsxComponent from '../components/JsxComponent.jsx'; import SvelteComponent from '../components/SvelteComponent.svelte'; diff --git a/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro b/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro index 454d7dfbaf9b..c6aba4c40194 100644 --- a/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro +++ b/packages/astro/test/fixtures/fontsource-package/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import "@fontsource/montserrat"; import "@fontsource/monofett"; +import "@fontsource/montserrat"; --- diff --git a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro index 85b228c43696..1bd33e57783d 100644 --- a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro +++ b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-in-slot.astro @@ -1,6 +1,6 @@ --- -import Layout from "../components/SlotRenderLayout.astro"; import RegularSlot from "../components/RegularSlot.astro" +import Layout from "../components/SlotRenderLayout.astro"; --- diff --git a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro index 337b4a95cff8..b9cbfae9617f 100644 --- a/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro +++ b/packages/astro/test/fixtures/head-injection/src/pages/with-slot-render.astro @@ -1,6 +1,6 @@ --- -import Layout from "../components/SlotRenderLayout.astro"; import Component from "../components/SlotRenderComponent.astro" +import Layout from "../components/SlotRenderLayout.astro"; --- diff --git a/packages/astro/test/fixtures/html-slots/src/pages/index.astro b/packages/astro/test/fixtures/html-slots/src/pages/index.astro index aa4a3bd2587a..6ccfffe417e1 100644 --- a/packages/astro/test/fixtures/html-slots/src/pages/index.astro +++ b/packages/astro/test/fixtures/html-slots/src/pages/index.astro @@ -1,7 +1,7 @@ --- import Default from '../components/Default.html'; -import Named from '../components/Named.html'; import Inline from '../components/Inline.html'; +import Named from '../components/Named.html'; --- Default diff --git a/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro b/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro index c751b2f77fb1..d3e1e31e8fa2 100644 --- a/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro +++ b/packages/astro/test/fixtures/hydration-race/src/components/Wrapper.astro @@ -1,6 +1,6 @@ --- -import One from './One.jsx'; import Deeper from './Deeper.astro'; +import One from './One.jsx'; ---
diff --git a/packages/astro/test/fixtures/hydration-race/src/pages/index.astro b/packages/astro/test/fixtures/hydration-race/src/pages/index.astro index d5272cc7563f..6b196b36d057 100644 --- a/packages/astro/test/fixtures/hydration-race/src/pages/index.astro +++ b/packages/astro/test/fixtures/hydration-race/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Wrapper from '../components/Wrapper.astro'; import One from '../components/One.jsx'; +import Wrapper from '../components/Wrapper.astro'; --- diff --git a/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro b/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro index d138455a3e3f..c6186a7b7622 100644 --- a/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro +++ b/packages/astro/test/fixtures/i18n-routing-subdomain/src/pages/index.astro @@ -1,5 +1,5 @@ --- -import { getRelativeLocaleUrl, getAbsoluteLocaleUrl, getPathByLocale, getLocaleByPath } from "astro:i18n"; +import { getAbsoluteLocaleUrl, getLocaleByPath, getPathByLocale, getRelativeLocaleUrl } from "astro:i18n"; let absoluteLocaleUrl_pt = getAbsoluteLocaleUrl("pt", "about"); let absoluteLocaleUrl_it = getAbsoluteLocaleUrl("it"); diff --git a/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro b/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro index f65356e8fab1..4ec7e5ae57fd 100644 --- a/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro +++ b/packages/astro/test/fixtures/i18n-routing/src/pages/virtual-module.astro @@ -1,5 +1,5 @@ --- -import { getRelativeLocaleUrl, getAbsoluteLocaleUrl, getPathByLocale, getLocaleByPath } from "astro:i18n"; +import { getAbsoluteLocaleUrl, getLocaleByPath, getPathByLocale, getRelativeLocaleUrl } from "astro:i18n"; let about = getRelativeLocaleUrl("pt", "about"); let spanish = getRelativeLocaleUrl("es", "about"); diff --git a/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro b/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro index cfd28a3d4b15..91c1b5ebabd9 100644 --- a/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro +++ b/packages/astro/test/fixtures/jsx/src/pages/frameworks.astro @@ -1,10 +1,10 @@ --- -import FrameworkSolid from '../components/solid/SolidCounter.jsx' -import FrameworkPreact from '../components/preact/PreactCounter.jsx' -import FrameworkReact from '../components/react/ReactCounter.jsx' +import FrameworkMDX from '../components/Content.mdx' import FrameworkSvelte from '../components/SvelteCounter.svelte' import FrameworkVue from '../components/VueCounter.vue' -import FrameworkMDX from '../components/Content.mdx' +import FrameworkPreact from '../components/preact/PreactCounter.jsx' +import FrameworkReact from '../components/react/ReactCounter.jsx' +import FrameworkSolid from '../components/solid/SolidCounter.jsx' ---
diff --git a/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro b/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro index 1708d1cc9cf9..c5f4756c354a 100644 --- a/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro +++ b/packages/astro/test/fixtures/multiple-renderers/src/pages/index.astro @@ -1,5 +1,5 @@ --- - function Component() { +function Component() { return `
works
`; } --- diff --git a/packages/astro/test/fixtures/preact-component/src/pages/fn.astro b/packages/astro/test/fixtures/preact-component/src/pages/fn.astro index ced75e301963..6d8f6f7ed75e 100644 --- a/packages/astro/test/fixtures/preact-component/src/pages/fn.astro +++ b/packages/astro/test/fixtures/preact-component/src/pages/fn.astro @@ -1,6 +1,6 @@ --- -import FunctionComponent from '../components/Function.jsx'; import ArrowFunctionComponent from '../components/ArrowFunction.jsx'; +import FunctionComponent from '../components/Function.jsx'; --- diff --git a/packages/astro/test/fixtures/preact-component/src/pages/signals.astro b/packages/astro/test/fixtures/preact-component/src/pages/signals.astro index bfe4a102058f..b68fde36d633 100644 --- a/packages/astro/test/fixtures/preact-component/src/pages/signals.astro +++ b/packages/astro/test/fixtures/preact-component/src/pages/signals.astro @@ -1,6 +1,6 @@ --- -import Signals from '../components/Signals'; import { signal } from '@preact/signals'; +import Signals from '../components/Signals'; const count = signal(1); --- diff --git a/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro b/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro index 945f965f56fc..0d774e80bbd4 100644 --- a/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro +++ b/packages/astro/test/fixtures/react-jsx-export/src/pages/index.astro @@ -1,6 +1,6 @@ --- +import {ConstDeclarationExport, FunctionDeclarationExport,LetDeclarationExport } from '../components/DeclarationExportTest' import ListAsDefaultExport, {ListExport, RenamedListExport, ListExportTestComponent} from '../components/ListExportTest' -import {ConstDeclarationExport, LetDeclarationExport, FunctionDeclarationExport} from '../components/DeclarationExportTest' import AnonymousArrowDefaultExport from '../components/defaultExport/AnonymousArrowDefaultExport' import AnonymousFunctionDefaultExport from '../components/defaultExport/AnonymousFunctionDefaultExport' import HocDefaultExport from '../components/defaultExport/HocDefaultExport' diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro index 622638e70003..f212b6e53eaa 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/[...catchall].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { lang: 'de', catchall: '1/2' } }, { params: { lang: 'en', catchall: '1/2' } } diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro index a0bf178818d2..4af288f0bfc4 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[lang]/index.astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { lang: 'de' } }, // always shadowed by /de/index.astro { params: { lang: 'en' } } diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro b/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro index 7543bce3a429..74f5d463f2ad 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[page].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { page: "page-1" } diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro b/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro index 40994284417d..55e8161bb4d2 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { slug: "slug-1" }, diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro index 839a46f9bd0f..a3a57b006af4 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[...slug].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { slug: "1/2" }, diff --git a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro index 47b332a321c7..a9245b5ba1e8 100644 --- a/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro +++ b/packages/astro/test/fixtures/routing-priority/src/pages/posts/[pid].astro @@ -1,5 +1,5 @@ --- - export async function getStaticPaths() { +export async function getStaticPaths() { return [ { params: { pid: 'post-1' } }, { params: { pid: 'post-2' } } diff --git a/packages/astro/test/fixtures/solid-component/src/pages/index.astro b/packages/astro/test/fixtures/solid-component/src/pages/index.astro index 06a35b2879c4..e4931ded1e61 100644 --- a/packages/astro/test/fixtures/solid-component/src/pages/index.astro +++ b/packages/astro/test/fixtures/solid-component/src/pages/index.astro @@ -1,9 +1,9 @@ --- -import Hello from '../components/Hello.jsx'; -import WithNewlines from '../components/WithNewlines.jsx'; import { Router } from "@solidjs/router"; -import ProxyComponent from '../components/ProxyComponent.jsx'; import { Counter as DepCounter } from '@test/solid-jsx-component'; +import Hello from '../components/Hello.jsx'; +import ProxyComponent from '../components/ProxyComponent.jsx'; +import WithNewlines from '../components/WithNewlines.jsx'; --- Solid diff --git a/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro b/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro index 60f0b429b541..bf968b5aca2c 100644 --- a/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro +++ b/packages/astro/test/fixtures/solid-component/src/pages/ssr-client-none.astro @@ -1,6 +1,6 @@ --- -import { AsyncComponent } from '../components/async-components.jsx'; import { LazyCounter } from '../components/LazyCounter.jsx'; +import { AsyncComponent } from '../components/async-components.jsx'; --- diff --git a/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro b/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro index 9f44b97c5fe8..62d5e4afdf71 100644 --- a/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro +++ b/packages/astro/test/fixtures/special-chars-in-component-imports/src/pages/index.astro @@ -1,11 +1,11 @@ --- import CaretCounter from '../components/^--with-carets/Counter'; import RocketCounter from '../components/and-rockets-🚀/Counter'; +import RoundBracketCounter from '../components/with-(round-brackets)/Counter'; +import SquareBracketCounter from '../components/with-[square-brackets]/Counter'; // Not supported in Vite // import PercentCounter from '../components/now-100%-better/Counter'; import SpaceCounter from '../components/with some spaces/Counter'; -import RoundBracketCounter from '../components/with-(round-brackets)/Counter'; -import SquareBracketCounter from '../components/with-[square-brackets]/Counter'; --- diff --git a/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro b/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro index 9677a6c52b86..6d66d98967f4 100644 --- a/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro +++ b/packages/astro/test/fixtures/static-build/src/pages/hoisted.astro @@ -1,6 +1,6 @@ --- -import InlineHoisted from '../components/InlineHoisted.astro'; import ExternalHoisted from '../components/ExternalHoisted.astro'; +import InlineHoisted from '../components/InlineHoisted.astro'; --- diff --git a/packages/astro/test/fixtures/static-build/src/pages/index.astro b/packages/astro/test/fixtures/static-build/src/pages/index.astro index 5bd2410ac416..054b82a01fb7 100644 --- a/packages/astro/test/fixtures/static-build/src/pages/index.astro +++ b/packages/astro/test/fixtures/static-build/src/pages/index.astro @@ -1,7 +1,7 @@ --- +import { test as ssrConfigTest } from '@test/static-build-pkg'; import MainHead from '../components/MainHead.astro'; import Nav from '../components/Nav/index.jsx'; -import { test as ssrConfigTest } from '@test/static-build-pkg'; let allPosts = await Astro.glob('./posts/*.md'); // Note that this just tests a warning diff --git a/packages/astro/test/fixtures/streaming/src/pages/index.astro b/packages/astro/test/fixtures/streaming/src/pages/index.astro index ef0e8eb49b9a..dd680eba7650 100644 --- a/packages/astro/test/fixtures/streaming/src/pages/index.astro +++ b/packages/astro/test/fixtures/streaming/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Header from '../components/Header.astro'; import AsyncEach from '../components/AsyncEach.astro'; +import Header from '../components/Header.astro'; import { wait } from '../wait'; async function * list() { diff --git a/packages/create-astro/src/messages.ts b/packages/create-astro/src/messages.ts index 0109835c6a07..eeeba5a50468 100644 --- a/packages/create-astro/src/messages.ts +++ b/packages/create-astro/src/messages.ts @@ -1,6 +1,6 @@ import { exec } from 'node:child_process'; /* eslint no-console: 'off' */ -import { color, label, say as houston, spinner as load } from '@astrojs/cli-kit'; +import { color, say as houston, label, spinner as load } from '@astrojs/cli-kit'; import { align, sleep } from '@astrojs/cli-kit/utils'; import stripAnsi from 'strip-ansi'; import { shell } from './shell.js'; diff --git a/packages/db/test/fixtures/basics/db/config.ts b/packages/db/test/fixtures/basics/db/config.ts index d8c476db19d3..010ed3a1863d 100644 --- a/packages/db/test/fixtures/basics/db/config.ts +++ b/packages/db/test/fixtures/basics/db/config.ts @@ -1,5 +1,5 @@ -import { Themes } from './theme'; import { column, defineDb, defineTable } from 'astro:db'; +import { Themes } from './theme'; const Author = defineTable({ columns: { diff --git a/packages/db/test/fixtures/basics/db/seed.ts b/packages/db/test/fixtures/basics/db/seed.ts index ec5ab2e0c274..9a1ef4322e04 100644 --- a/packages/db/test/fixtures/basics/db/seed.ts +++ b/packages/db/test/fixtures/basics/db/seed.ts @@ -1,6 +1,6 @@ +import { Author, Session, User, db } from 'astro:db'; import { asDrizzleTable } from '@astrojs/db/utils'; import { Themes as ThemesConfig } from './theme'; -import { Author, Session, User, db } from 'astro:db'; const Themes = asDrizzleTable('Themes', ThemesConfig); export default async function () { diff --git a/packages/db/test/fixtures/basics/src/pages/index.astro b/packages/db/test/fixtures/basics/src/pages/index.astro index 2d21f81103b8..2be0c4b2385a 100644 --- a/packages/db/test/fixtures/basics/src/pages/index.astro +++ b/packages/db/test/fixtures/basics/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { Author, db, Themes } from 'astro:db'; +import { Author, Themes, db } from 'astro:db'; const authors = await db.select().from(Author); const themes = await db.select().from(Themes); diff --git a/packages/db/test/fixtures/basics/src/pages/login.astro b/packages/db/test/fixtures/basics/src/pages/login.astro index 41b86ab149ea..4551fc48325f 100644 --- a/packages/db/test/fixtures/basics/src/pages/login.astro +++ b/packages/db/test/fixtures/basics/src/pages/login.astro @@ -1,5 +1,5 @@ --- -import { db, Session, User, eq } from 'astro:db'; +import { Session, User, db, eq } from 'astro:db'; const users = await db.select().from(User); const sessions = await db.select().from(Session).innerJoin(User, eq(Session.userId, User.id)); diff --git a/packages/db/test/fixtures/basics/src/pages/run.json.ts b/packages/db/test/fixtures/basics/src/pages/run.json.ts index 82d5a6a7c5e5..a86619314414 100644 --- a/packages/db/test/fixtures/basics/src/pages/run.json.ts +++ b/packages/db/test/fixtures/basics/src/pages/run.json.ts @@ -1,6 +1,6 @@ +import { db, sql } from 'astro:db'; /// import type { APIRoute } from 'astro'; -import { db, sql } from 'astro:db'; export const GET: APIRoute = async () => { const authors = await db.run(sql`SELECT * FROM Author`); diff --git a/packages/db/test/fixtures/db-in-src/db/seed.ts b/packages/db/test/fixtures/db-in-src/db/seed.ts index 7ff9f5f30dc8..a84e6345498e 100644 --- a/packages/db/test/fixtures/db-in-src/db/seed.ts +++ b/packages/db/test/fixtures/db-in-src/db/seed.ts @@ -1,5 +1,5 @@ -import { asDrizzleTable } from '@astrojs/db/utils'; import { User, db } from 'astro:db'; +import { asDrizzleTable } from '@astrojs/db/utils'; export default async function () { await db.batch([ diff --git a/packages/db/test/fixtures/db-in-src/pages/index.astro b/packages/db/test/fixtures/db-in-src/pages/index.astro index 90f6381150e5..4b79dba2c859 100644 --- a/packages/db/test/fixtures/db-in-src/pages/index.astro +++ b/packages/db/test/fixtures/db-in-src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { db, User } from 'astro:db'; +import { User, db } from 'astro:db'; const users = await db.select().from(User); --- diff --git a/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts b/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts index 9aef159c9ba8..8e6bad8c36fc 100644 --- a/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts +++ b/packages/db/test/fixtures/error-handling/src/pages/foreign-key-constraint.json.ts @@ -1,5 +1,5 @@ -import type { APIRoute } from 'astro'; import { Ingredient, db, isDbError } from 'astro:db'; +import type { APIRoute } from 'astro'; export const GET: APIRoute = async () => { try { diff --git a/packages/db/test/fixtures/integration-only/integration/config.ts b/packages/db/test/fixtures/integration-only/integration/config.ts index d1f1aac26398..71490be95727 100644 --- a/packages/db/test/fixtures/integration-only/integration/config.ts +++ b/packages/db/test/fixtures/integration-only/integration/config.ts @@ -1,5 +1,5 @@ -import { menu } from './shared'; import { defineDb } from 'astro:db'; +import { menu } from './shared'; export default defineDb({ tables: { diff --git a/packages/db/test/fixtures/integration-only/integration/seed.ts b/packages/db/test/fixtures/integration-only/integration/seed.ts index d46b05e1c1fa..ed2b2e2ebf2b 100644 --- a/packages/db/test/fixtures/integration-only/integration/seed.ts +++ b/packages/db/test/fixtures/integration-only/integration/seed.ts @@ -1,6 +1,6 @@ +import { db } from 'astro:db'; import { asDrizzleTable } from '@astrojs/db/utils'; import { menu } from './shared'; -import { db } from 'astro:db'; export default async function () { const table = asDrizzleTable('menu', menu); diff --git a/packages/db/test/fixtures/integrations/integration/config.ts b/packages/db/test/fixtures/integrations/integration/config.ts index d1f1aac26398..71490be95727 100644 --- a/packages/db/test/fixtures/integrations/integration/config.ts +++ b/packages/db/test/fixtures/integrations/integration/config.ts @@ -1,5 +1,5 @@ -import { menu } from './shared'; import { defineDb } from 'astro:db'; +import { menu } from './shared'; export default defineDb({ tables: { diff --git a/packages/db/test/fixtures/integrations/integration/seed.ts b/packages/db/test/fixtures/integrations/integration/seed.ts index d46b05e1c1fa..ed2b2e2ebf2b 100644 --- a/packages/db/test/fixtures/integrations/integration/seed.ts +++ b/packages/db/test/fixtures/integrations/integration/seed.ts @@ -1,6 +1,6 @@ +import { db } from 'astro:db'; import { asDrizzleTable } from '@astrojs/db/utils'; import { menu } from './shared'; -import { db } from 'astro:db'; export default async function () { const table = asDrizzleTable('menu', menu); diff --git a/packages/db/test/fixtures/local-prod/db/seed.ts b/packages/db/test/fixtures/local-prod/db/seed.ts index 7ff9f5f30dc8..a84e6345498e 100644 --- a/packages/db/test/fixtures/local-prod/db/seed.ts +++ b/packages/db/test/fixtures/local-prod/db/seed.ts @@ -1,5 +1,5 @@ -import { asDrizzleTable } from '@astrojs/db/utils'; import { User, db } from 'astro:db'; +import { asDrizzleTable } from '@astrojs/db/utils'; export default async function () { await db.batch([ diff --git a/packages/db/test/fixtures/local-prod/src/pages/index.astro b/packages/db/test/fixtures/local-prod/src/pages/index.astro index 1e2bdc7b975a..f36d44bd4eb3 100644 --- a/packages/db/test/fixtures/local-prod/src/pages/index.astro +++ b/packages/db/test/fixtures/local-prod/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { db, User } from 'astro:db'; +import { User, db } from 'astro:db'; const users = await db.select().from(User); --- diff --git a/packages/db/test/fixtures/no-apptoken/src/pages/index.astro b/packages/db/test/fixtures/no-apptoken/src/pages/index.astro index 62d7b085784f..477e18fa3306 100644 --- a/packages/db/test/fixtures/no-apptoken/src/pages/index.astro +++ b/packages/db/test/fixtures/no-apptoken/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { db, User } from 'astro:db'; +import { User, db } from 'astro:db'; // Just for the side-effect of running all the code await db.select().from(User); diff --git a/packages/db/test/fixtures/recipes/src/pages/index.astro b/packages/db/test/fixtures/recipes/src/pages/index.astro index f1856c12ed9e..9fd2dac41915 100644 --- a/packages/db/test/fixtures/recipes/src/pages/index.astro +++ b/packages/db/test/fixtures/recipes/src/pages/index.astro @@ -1,6 +1,6 @@ --- /// -import { Recipe, Ingredient, db, eq } from 'astro:db'; +import { Ingredient, Recipe, db, eq } from 'astro:db'; const ingredientsByRecipe = await db .select({ diff --git a/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx b/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx index a4f69c55850b..f393d8281609 100644 --- a/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx +++ b/packages/db/test/fixtures/ticketing-example/src/components/Form.tsx @@ -1,6 +1,5 @@ // Generated by simple:form -import { type ComponentProps, createContext, useContext, useState } from 'react'; import { navigate } from 'astro:transitions/client'; import { type FieldErrors, @@ -13,6 +12,7 @@ import { toValidateField, validateForm, } from 'simple:form'; +import { type ComponentProps, createContext, useContext, useState } from 'react'; export function useCreateFormContext(validator: FormValidator, fieldErrors?: FieldErrors) { const initial = getInitialFormState({ validator, fieldErrors }); diff --git a/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx b/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx index bb244122bdae..5e488d69d70f 100644 --- a/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx +++ b/packages/db/test/fixtures/ticketing-example/src/pages/[event]/_Ticket.tsx @@ -1,7 +1,7 @@ +import { createForm } from 'simple:form'; import { useState } from 'react'; import { z } from 'zod'; import { Form, Input } from '../../components/Form'; -import { createForm } from 'simple:form'; export const ticketForm = createForm({ email: z.string().email(), diff --git a/packages/integrations/lit/server-shim.js b/packages/integrations/lit/server-shim.js index 7cbee09f40b2..ed371f89a32f 100644 --- a/packages/integrations/lit/server-shim.js +++ b/packages/integrations/lit/server-shim.js @@ -1,4 +1,4 @@ -import { HTMLElement as litShimHTMLElement, customElements as litCE } from '@lit-labs/ssr-dom-shim'; +import { customElements as litCE, HTMLElement as litShimHTMLElement } from '@lit-labs/ssr-dom-shim'; // Something at build time injects document.currentScript = undefined instead of // document.currentScript = null. This causes Sass build to fail because it diff --git a/packages/integrations/markdoc/src/content-entry-type.ts b/packages/integrations/markdoc/src/content-entry-type.ts index 5168c49c16a5..8fc4bd77cceb 100644 --- a/packages/integrations/markdoc/src/content-entry-type.ts +++ b/packages/integrations/markdoc/src/content-entry-type.ts @@ -6,7 +6,7 @@ import Markdoc from '@markdoc/markdoc'; import type { AstroConfig, ContentEntryType } from 'astro'; import { emitESMImage } from 'astro/assets/utils'; import matter from 'gray-matter'; -import type { ErrorPayload as ViteErrorPayload, Rollup } from 'vite'; +import type { Rollup, ErrorPayload as ViteErrorPayload } from 'vite'; import type { ComponentConfig } from './config.js'; import { htmlTokenTransform } from './html/transform/html-token-transform.js'; import type { MarkdocConfigResult } from './load-config.js'; diff --git a/packages/integrations/markdoc/src/runtime-assets-config.ts b/packages/integrations/markdoc/src/runtime-assets-config.ts index d93605f6c91d..0211c1381c74 100644 --- a/packages/integrations/markdoc/src/runtime-assets-config.ts +++ b/packages/integrations/markdoc/src/runtime-assets-config.ts @@ -1,7 +1,7 @@ -import type { Config as MarkdocConfig } from '@markdoc/markdoc'; -import Markdoc from '@markdoc/markdoc'; //@ts-expect-error Cannot find module 'astro:assets' or its corresponding type declarations. import { Image } from 'astro:assets'; +import type { Config as MarkdocConfig } from '@markdoc/markdoc'; +import Markdoc from '@markdoc/markdoc'; export const assetsConfig: MarkdocConfig = { nodes: { diff --git a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js index 75dd29d8e93e..cb3c84652622 100644 --- a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js +++ b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/collection.json.js @@ -1,6 +1,6 @@ +import { getCollection } from 'astro:content'; import { stringify } from 'devalue'; import { stripAllRenderFn } from '../../utils.js'; -import { getCollection } from 'astro:content'; export async function GET() { const posts = await getCollection('blog'); diff --git a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js index 1399aa3aaed6..53dd17013ba7 100644 --- a/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js +++ b/packages/integrations/markdoc/test/fixtures/content-collections/src/pages/entry.json.js @@ -1,6 +1,6 @@ +import { getEntryBySlug } from 'astro:content'; import { stringify } from 'devalue'; import { stripRenderFn } from '../../utils.js'; -import { getEntryBySlug } from 'astro:content'; export async function GET() { const post = await getEntryBySlug('blog', 'post-1'); diff --git a/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro b/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro index 2baef9d69637..90b021e95525 100644 --- a/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro +++ b/packages/integrations/markdoc/test/fixtures/headings-custom/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- -import { getCollection, CollectionEntry } from "astro:content"; +import { CollectionEntry, getCollection } from "astro:content"; export async function getStaticPaths() { const docs = await getCollection('docs'); diff --git a/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro b/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro index 2baef9d69637..90b021e95525 100644 --- a/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro +++ b/packages/integrations/markdoc/test/fixtures/headings/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- -import { getCollection, CollectionEntry } from "astro:content"; +import { CollectionEntry, getCollection } from "astro:content"; export async function getStaticPaths() { const docs = await getCollection('docs'); diff --git a/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro b/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro index aac1294525ba..e572c04d7839 100644 --- a/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro +++ b/packages/integrations/markdoc/test/fixtures/image-assets/src/components/Image.astro @@ -1,7 +1,7 @@ --- +import { Image } from 'astro:assets'; // src/components/MyImage.astro import type { ImageMetadata } from 'astro'; -import { Image } from 'astro:assets'; type Props = { src: string | ImageMetadata; alt: string; diff --git a/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro b/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro index 1f60f6589b29..bea51d3b584b 100644 --- a/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro +++ b/packages/integrations/markdoc/test/fixtures/render-html/src/pages/[slug].astro @@ -1,5 +1,5 @@ --- -import { getEntryBySlug, getCollection } from "astro:content"; +import { getCollection, getEntryBySlug } from "astro:content"; const { slug } = Astro.params; diff --git a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro index 7d6ca0ca4d37..5afb5be92216 100644 --- a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro +++ b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/posts/[post].astro @@ -1,7 +1,7 @@ --- import { getCollection } from 'astro:content'; -import Layout from '../../layouts/ContentLayout.astro'; import SmallCaps from '../../components/SmallCaps.astro'; +import Layout from '../../layouts/ContentLayout.astro'; export async function getStaticPaths() { const entries = await getCollection('posts'); diff --git a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro index 9a7b76a10283..7c8000642521 100644 --- a/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro +++ b/packages/integrations/mdx/test/fixtures/css-head-mdx/src/pages/remote.astro @@ -1,8 +1,8 @@ --- -import '../styles/global.css' -import Layout from '../layouts/One.astro'; -import Paragraph from '../components/P.astro'; import { Markdown } from 'astro-remote' +import Paragraph from '../components/P.astro'; +import Layout from '../layouts/One.astro'; +import '../styles/global.css' --- diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro b/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro index e3541867c7fc..3cb699e3ab68 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro +++ b/packages/integrations/mdx/test/fixtures/mdx-images/src/components/MyImage.astro @@ -1,6 +1,6 @@ --- -import type { ImageMetadata } from 'astro'; import { Image } from 'astro:assets'; +import type { ImageMetadata } from 'astro'; type Props = { src: string | ImageMetadata; diff --git a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro index e5f7a61d971d..4e4db66a4d17 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro +++ b/packages/integrations/mdx/test/fixtures/mdx-images/src/pages/esm-import.astro @@ -1,6 +1,6 @@ --- -import MDX from '../components/Component.mdx'; import MyImage from 'src/components/MyImage.astro'; +import MDX from '../components/Component.mdx'; --- diff --git a/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro b/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro index b522a30280ca..9bfa7cebf7c7 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro +++ b/packages/integrations/mdx/test/fixtures/mdx-optimize/src/pages/import.astro @@ -1,6 +1,6 @@ --- -import { Content, components } from './index.mdx' import Strong from '../components/Strong.astro' +import { Content, components } from './index.mdx' --- diff --git a/packages/integrations/react/server.js b/packages/integrations/react/server.js index f7de2ff2e22b..b2e94fbf0b6e 100644 --- a/packages/integrations/react/server.js +++ b/packages/integrations/react/server.js @@ -1,8 +1,8 @@ +import opts from 'astro:react:opts'; import React from 'react'; import ReactDOM from 'react-dom/server'; import { incrementId } from './context.js'; import StaticHtml from './static-html.js'; -import opts from 'astro:react:opts'; const slotName = (str) => str.trim().replace(/[-_]([a-z])/g, (_, w) => w.toUpperCase()); const reactTypeof = Symbol.for('react.element'); diff --git a/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro b/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro index 3afd8233f2d7..b3b95c4b3b60 100644 --- a/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro +++ b/packages/integrations/react/test/fixtures/react-component/src/pages/index.astro @@ -1,12 +1,12 @@ --- -import Hello from '../components/Hello.jsx'; -import Later from '../components/Goodbye.vue'; import ArrowFunction from '../components/ArrowFunction.jsx'; +import CloneElement from '../components/CloneElement'; +import Later from '../components/Goodbye.vue'; +import Hello from '../components/Hello.jsx'; import PropsSpread from '../components/PropsSpread.jsx'; -import {Research2} from '../components/Research.jsx'; import Pure from '../components/Pure.jsx'; +import {Research2} from '../components/Research.jsx'; import TypeScriptComponent from '../components/TypeScriptComponent'; -import CloneElement from '../components/CloneElement'; import WithChildren from '../components/WithChildren'; import WithId from '../components/WithId'; diff --git a/packages/integrations/vue/client.js b/packages/integrations/vue/client.js index 3fdf53dae964..807f843fc930 100644 --- a/packages/integrations/vue/client.js +++ b/packages/integrations/vue/client.js @@ -1,6 +1,6 @@ +import { setup } from 'virtual:@astrojs/vue/app'; import { Suspense, createApp, createSSRApp, h } from 'vue'; import StaticHtml from './static-html.js'; -import { setup } from 'virtual:@astrojs/vue/app'; export default (element) => async (Component, props, slotted, { client }) => { diff --git a/packages/integrations/vue/server.js b/packages/integrations/vue/server.js index 55d61871d881..be57dd43ab94 100644 --- a/packages/integrations/vue/server.js +++ b/packages/integrations/vue/server.js @@ -1,7 +1,7 @@ +import { setup } from 'virtual:@astrojs/vue/app'; import { createSSRApp, h } from 'vue'; import { renderToString } from 'vue/server-renderer'; import StaticHtml from './static-html.js'; -import { setup } from 'virtual:@astrojs/vue/app'; function check(Component) { return !!Component['ssrRender'] || !!Component['__ssrInlineRender']; diff --git a/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro b/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro index a517f8a979cc..511b626baa6b 100644 --- a/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro +++ b/packages/integrations/vue/test/fixtures/app-entrypoint/src/pages/index.astro @@ -1,8 +1,8 @@ --- import Foo from '../components/Foo.vue'; -import MultipleScriptBlocks, { doubleNumber } from '../components/MultipleScriptBlocks.vue'; import GenericComponent from '../components/Generics.vue'; import GenericsAndBlocks, { customFormatter } from '../components/GenericsAndBlocks.vue'; +import MultipleScriptBlocks, { doubleNumber } from '../components/MultipleScriptBlocks.vue'; --- diff --git a/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro b/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro index e17de6edf9f8..b2f292d1057c 100644 --- a/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro +++ b/packages/integrations/vue/test/fixtures/basics/src/pages/index.astro @@ -1,6 +1,6 @@ --- -import Parent from '../components/Parent.astro'; import Bar from '../components/Foo.vue'; +import Parent from '../components/Parent.astro'; --- diff --git a/packages/markdown/remark/src/frontmatter-injection.ts b/packages/markdown/remark/src/frontmatter-injection.ts index cb53d2ab28ee..91b98ebcba63 100644 --- a/packages/markdown/remark/src/frontmatter-injection.ts +++ b/packages/markdown/remark/src/frontmatter-injection.ts @@ -1,4 +1,4 @@ -import type { VFile, VFileData as Data } from 'vfile'; +import type { VFileData as Data, VFile } from 'vfile'; import type { MarkdownAstroData } from './types.js'; function isValidAstroData(obj: unknown): obj is MarkdownAstroData { diff --git a/packages/telemetry/src/system-info.ts b/packages/telemetry/src/system-info.ts index 1315c63c9485..2913b69414cb 100644 --- a/packages/telemetry/src/system-info.ts +++ b/packages/telemetry/src/system-info.ts @@ -1,5 +1,5 @@ import os from 'node:os'; -import { isCI, name as ciName } from 'ci-info'; +import { name as ciName, isCI } from 'ci-info'; import isDocker from 'is-docker'; import isWSL from 'is-wsl'; From 7c70b98120a009ea3fa1dab4e17dd5f13af27f4d Mon Sep 17 00:00:00 2001 From: Martin Trapp <94928215+martrapp@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:56:31 +0200 Subject: [PATCH 83/96] Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. (#10799) * Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. * better check --- .changeset/itchy-donuts-destroy.md | 5 ++++ .../src/pages/persist-1.astro | 26 +++++++++++++++++++ .../src/pages/persist-2.astro | 17 ++++++++++++ packages/astro/e2e/view-transitions.test.js | 17 ++++++++++++ packages/astro/src/transitions/router.ts | 4 +-- 5 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 .changeset/itchy-donuts-destroy.md create mode 100644 packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro create mode 100644 packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro diff --git a/.changeset/itchy-donuts-destroy.md b/.changeset/itchy-donuts-destroy.md new file mode 100644 index 000000000000..655b27a26565 --- /dev/null +++ b/.changeset/itchy-donuts-destroy.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro new file mode 100644 index 000000000000..830667b3e635 --- /dev/null +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-1.astro @@ -0,0 +1,26 @@ +--- +import Layout from '../components/Layout.astro'; +--- + +

Persist 1

+
+ + +
+
test content
+
+ diff --git a/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro new file mode 100644 index 000000000000..f79dedcd5ed6 --- /dev/null +++ b/packages/astro/e2e/fixtures/view-transitions/src/pages/persist-2.astro @@ -0,0 +1,17 @@ +--- +import Layout from '../components/Layout.astro'; +--- + +

Persist 2

+ go to 3 +
+
test content
+ + + + diff --git a/packages/astro/e2e/view-transitions.test.js b/packages/astro/e2e/view-transitions.test.js index b963bf2fd7f4..14cb8668d236 100644 --- a/packages/astro/e2e/view-transitions.test.js +++ b/packages/astro/e2e/view-transitions.test.js @@ -1403,3 +1403,20 @@ test.describe('View Transitions', () => { ).toEqual(0); }); }); + +test('transition:persist persists selection', async ({ page, astro }) => { + let text = ""; + page.on('console', (msg) => { + text=msg.text(); + }); + await page.goto(astro.resolveUrl('/persist-1')); + await expect(page.locator('#one'), 'should have content').toHaveText('Persist 1'); + // go to page 2 + await page.press('input[name="name"]', 'Enter'); + await expect(page.locator('#two'), 'should have content').toHaveText('Persist 2'); + expect(text).toBe('true some cool text 5 9'); + + await page.goBack(); + await expect(page.locator('#one'), 'should have content').toHaveText('Persist 1'); + expect(text).toBe('true true'); +}); diff --git a/packages/astro/src/transitions/router.ts b/packages/astro/src/transitions/router.ts index 5766656f471d..a68e423d059c 100644 --- a/packages/astro/src/transitions/router.ts +++ b/packages/astro/src/transitions/router.ts @@ -305,8 +305,8 @@ async function updateDOM( activeElement instanceof HTMLInputElement || activeElement instanceof HTMLTextAreaElement ) { - activeElement.selectionStart = start!; - activeElement.selectionEnd = end!; + if (typeof start === 'number') activeElement.selectionStart = start; + if (typeof end === 'number') activeElement.selectionEnd = end; } } }; From 58c345d3ea03f9db03dd00abf6ede754df17e7a1 Mon Sep 17 00:00:00 2001 From: Martin Trapp Date: Wed, 17 Apr 2024 09:57:24 +0000 Subject: [PATCH 84/96] [ci] format --- packages/astro/e2e/view-transitions.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/astro/e2e/view-transitions.test.js b/packages/astro/e2e/view-transitions.test.js index 14cb8668d236..ef76010a5871 100644 --- a/packages/astro/e2e/view-transitions.test.js +++ b/packages/astro/e2e/view-transitions.test.js @@ -1405,9 +1405,9 @@ test.describe('View Transitions', () => { }); test('transition:persist persists selection', async ({ page, astro }) => { - let text = ""; + let text = ''; page.on('console', (msg) => { - text=msg.text(); + text = msg.text(); }); await page.goto(astro.resolveUrl('/persist-1')); await expect(page.locator('#one'), 'should have content').toHaveText('Persist 1'); From 88e24518ab14c07722bc670f7c35e39a5068b607 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 17 Apr 2024 13:01:29 +0100 Subject: [PATCH 85/96] test: fix regression upon import sorting (#10802) --- biome.json | 18 +++++++++++------- .../css-order-layout/src/layouts/Main.astro | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/biome.json b/biome.json index aed74ad49681..fd35328f8184 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,14 @@ { "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", "files": { - "ignore": ["vendor", "dist/**"], + "ignore": [ + "vendor", + "**/dist/**", + "**/smoke/**", + "**/fixtures/**", + "**/vendor/**", + "**/.vercel/**" + ], "include": ["test/**", "e2e/**", "packages/**"] }, "formatter": { @@ -11,18 +18,15 @@ "ignore": [ "benchmark/projects/", "benchmark/results/", - "**/dist/**", - "**/smoke/**", - "**/fixtures/**", - "**/vendor/**", - "**/.vercel/**", ".changeset", "pnpm-lock.yaml", "package.json", "*.astro" ] }, - "organizeImports": { "enabled": true }, + "organizeImports": { + "enabled": true + }, "linter": { "enabled": false }, "javascript": { "formatter": { diff --git a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro index 225b8c1030ce..49f378bc641f 100644 --- a/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro +++ b/packages/astro/test/fixtures/css-order-layout/src/layouts/Main.astro @@ -1,6 +1,6 @@ --- -import BlueButton from "../components/BlueButton.astro"; import MainHead from "../components/MainHead.astro"; +import BlueButton from "../components/BlueButton.astro"; --- From 6ba89e4cc216ebf9206acf6d97b1519efef4f7a7 Mon Sep 17 00:00:00 2001 From: Robin Gisler <63500142+gislerro@users.noreply.github.com> Date: Thu, 18 Apr 2024 09:09:25 +0200 Subject: [PATCH 86/96] fix(sitemap): Trailing slashes on root url (#10772) * add tests that reveal issue * fix trailing slash root page issue * add changeset --- .changeset/late-bags-marry.md | 5 ++ packages/integrations/sitemap/package.json | 1 + packages/integrations/sitemap/src/index.ts | 11 ++- .../integrations/sitemap/src/write-sitemap.ts | 69 +++++++++++++++++++ .../trailing-slash/src/pages/index.astro | 8 +++ .../sitemap/test/trailing-slash.test.js | 29 ++++++-- pnpm-lock.yaml | 7 ++ 7 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 .changeset/late-bags-marry.md create mode 100644 packages/integrations/sitemap/src/write-sitemap.ts create mode 100644 packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro diff --git a/.changeset/late-bags-marry.md b/.changeset/late-bags-marry.md new file mode 100644 index 000000000000..af6b4ba3ef5b --- /dev/null +++ b/.changeset/late-bags-marry.md @@ -0,0 +1,5 @@ +--- +"@astrojs/sitemap": patch +--- + +Fixes an issue where the root url does not follow the `trailingSlash` config option diff --git a/packages/integrations/sitemap/package.json b/packages/integrations/sitemap/package.json index 9ccbf3d5bebc..cdff0a8aab99 100644 --- a/packages/integrations/sitemap/package.json +++ b/packages/integrations/sitemap/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "sitemap": "^7.1.1", + "stream-replace-string": "^2.0.0", "zod": "^3.22.4" }, "devDependencies": { diff --git a/packages/integrations/sitemap/src/index.ts b/packages/integrations/sitemap/src/index.ts index b0548d8f114c..a2fae5b5ade4 100644 --- a/packages/integrations/sitemap/src/index.ts +++ b/packages/integrations/sitemap/src/index.ts @@ -2,11 +2,11 @@ import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { AstroConfig, AstroIntegration } from 'astro'; import type { EnumChangefreq, LinkItem as LinkItemBase, SitemapItemLoose } from 'sitemap'; -import { simpleSitemapAndIndex } from 'sitemap'; import { ZodError } from 'zod'; -import { generateSitemap } from './generate-sitemap.js'; import { validateOptions } from './validate-options.js'; +import { generateSitemap } from './generate-sitemap.js'; +import { writeSitemap } from './write-sitemap.js'; export { EnumChangefreq as ChangeFreqEnum } from 'sitemap'; export type ChangeFreq = `${EnumChangefreq}`; @@ -167,14 +167,13 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => { } } const destDir = fileURLToPath(dir); - await simpleSitemapAndIndex({ + await writeSitemap({ hostname: finalSiteUrl.href, destinationDir: destDir, publicBasePath: config.base, sourceData: urlData, - limit: entryLimit, - gzip: false, - }); + limit: entryLimit + }, config) logger.info(`\`${OUTFILE}\` created at \`${path.relative(process.cwd(), destDir)}\``); } catch (err) { if (err instanceof ZodError) { diff --git a/packages/integrations/sitemap/src/write-sitemap.ts b/packages/integrations/sitemap/src/write-sitemap.ts new file mode 100644 index 000000000000..d55d4fc50b61 --- /dev/null +++ b/packages/integrations/sitemap/src/write-sitemap.ts @@ -0,0 +1,69 @@ +import { normalize, resolve } from 'path'; +import { createWriteStream, type WriteStream } from 'fs' +import { mkdir } from 'fs/promises'; +import { promisify } from 'util'; +import { Readable, pipeline } from 'stream'; +import replace from 'stream-replace-string' + +import { SitemapAndIndexStream, SitemapStream } from 'sitemap'; + +import type { AstroConfig } from 'astro'; +import type { SitemapItem } from "./index.js"; + +type WriteSitemapConfig = { + hostname: string; + sitemapHostname?: string; + sourceData: SitemapItem[]; + destinationDir: string; + publicBasePath?: string; + limit?: number; +} + +// adapted from sitemap.js/sitemap-simple +export async function writeSitemap({ hostname, sitemapHostname = hostname, +sourceData, destinationDir, limit = 50000, publicBasePath = './', }: WriteSitemapConfig, astroConfig: AstroConfig) { + + await mkdir(destinationDir, { recursive: true }) + + const sitemapAndIndexStream = new SitemapAndIndexStream({ + limit, + getSitemapStream: (i) => { + const sitemapStream = new SitemapStream({ + hostname, + }); + const path = `./sitemap-${i}.xml`; + const writePath = resolve(destinationDir, path); + if (!publicBasePath.endsWith('/')) { + publicBasePath += '/'; + } + const publicPath = normalize(publicBasePath + path); + + let stream: WriteStream + if (astroConfig.trailingSlash === 'never' || astroConfig.build.format === 'file') { + // workaround for trailing slash issue in sitemap.js: https://github.com/ekalinin/sitemap.js/issues/403 + const host = hostname.endsWith('/') ? hostname.slice(0, -1) : hostname + const searchStr = `${host}/` + const replaceStr = `${host}` + stream = sitemapStream.pipe(replace(searchStr, replaceStr)).pipe(createWriteStream(writePath)) + } else { + stream = sitemapStream.pipe(createWriteStream(writePath)) + } + + return [ + new URL( + publicPath, + sitemapHostname + ).toString(), + sitemapStream, + stream, + ]; + }, + }); + + let src = Readable.from(sourceData) + const indexPath = resolve( + destinationDir, + `./sitemap-index.xml` + ); + return promisify(pipeline)(src, sitemapAndIndexStream, createWriteStream(indexPath)); +} \ No newline at end of file diff --git a/packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro b/packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro new file mode 100644 index 000000000000..5a29cbdbe836 --- /dev/null +++ b/packages/integrations/sitemap/test/fixtures/trailing-slash/src/pages/index.astro @@ -0,0 +1,8 @@ + + + Index + + +

Index

+ + \ No newline at end of file diff --git a/packages/integrations/sitemap/test/trailing-slash.test.js b/packages/integrations/sitemap/test/trailing-slash.test.js index e0a6158fbe4d..181f0def53d2 100644 --- a/packages/integrations/sitemap/test/trailing-slash.test.js +++ b/packages/integrations/sitemap/test/trailing-slash.test.js @@ -22,7 +22,10 @@ describe('Trailing slash', () => { it('URLs end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one/'); + + assert.equal(urls[0].loc[0], 'http://example.com/'); + assert.equal(urls[1].loc[0], 'http://example.com/one/'); + assert.equal(urls[2].loc[0], 'http://example.com/two/'); }); }); @@ -41,7 +44,10 @@ describe('Trailing slash', () => { it('URLs do not end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one'); + + assert.equal(urls[0].loc[0], 'http://example.com'); + assert.equal(urls[1].loc[0], 'http://example.com/one'); + assert.equal(urls[2].loc[0], 'http://example.com/two'); }); }); }); @@ -55,10 +61,13 @@ describe('Trailing slash', () => { await fixture.build(); }); - it('URLs do no end with trailing slash', async () => { + it('URLs do not end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one'); + + assert.equal(urls[0].loc[0], 'http://example.com'); + assert.equal(urls[1].loc[0], 'http://example.com/one'); + assert.equal(urls[2].loc[0], 'http://example.com/two'); }); describe('with base path', () => { before(async () => { @@ -73,7 +82,9 @@ describe('Trailing slash', () => { it('URLs do not end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/base/one'); + assert.equal(urls[0].loc[0], 'http://example.com/base'); + assert.equal(urls[1].loc[0], 'http://example.com/base/one'); + assert.equal(urls[2].loc[0], 'http://example.com/base/two'); }); }); }); @@ -90,7 +101,9 @@ describe('Trailing slash', () => { it('URLs end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/one/'); + assert.equal(urls[0].loc[0], 'http://example.com/'); + assert.equal(urls[1].loc[0], 'http://example.com/one/'); + assert.equal(urls[2].loc[0], 'http://example.com/two/'); }); describe('with base path', () => { before(async () => { @@ -105,7 +118,9 @@ describe('Trailing slash', () => { it('URLs end with trailing slash', async () => { const data = await readXML(fixture.readFile('/sitemap-0.xml')); const urls = data.urlset.url; - assert.equal(urls[0].loc[0], 'http://example.com/base/one/'); + assert.equal(urls[0].loc[0], 'http://example.com/base/'); + assert.equal(urls[1].loc[0], 'http://example.com/base/one/'); + assert.equal(urls[2].loc[0], 'http://example.com/base/two/'); }); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf98a10d4196..ada46bae03a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4888,6 +4888,9 @@ importers: sitemap: specifier: ^7.1.1 version: 7.1.1 + stream-replace-string: + specifier: ^2.0.0 + version: 2.0.0 zod: specifier: ^3.22.4 version: 3.22.4 @@ -15869,6 +15872,10 @@ packages: bl: 5.1.0 dev: false + /stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + dev: false + /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: From 9879f22af39be9841089236f32176ab8355e1bc5 Mon Sep 17 00:00:00 2001 From: Robin Gisler Date: Thu, 18 Apr 2024 07:10:24 +0000 Subject: [PATCH 87/96] [ci] format --- packages/integrations/sitemap/src/index.ts | 19 +-- .../integrations/sitemap/src/write-sitemap.ts | 112 +++++++++--------- 2 files changed, 67 insertions(+), 64 deletions(-) diff --git a/packages/integrations/sitemap/src/index.ts b/packages/integrations/sitemap/src/index.ts index a2fae5b5ade4..36ecc8eac677 100644 --- a/packages/integrations/sitemap/src/index.ts +++ b/packages/integrations/sitemap/src/index.ts @@ -4,8 +4,8 @@ import type { AstroConfig, AstroIntegration } from 'astro'; import type { EnumChangefreq, LinkItem as LinkItemBase, SitemapItemLoose } from 'sitemap'; import { ZodError } from 'zod'; -import { validateOptions } from './validate-options.js'; import { generateSitemap } from './generate-sitemap.js'; +import { validateOptions } from './validate-options.js'; import { writeSitemap } from './write-sitemap.js'; export { EnumChangefreq as ChangeFreqEnum } from 'sitemap'; @@ -167,13 +167,16 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => { } } const destDir = fileURLToPath(dir); - await writeSitemap({ - hostname: finalSiteUrl.href, - destinationDir: destDir, - publicBasePath: config.base, - sourceData: urlData, - limit: entryLimit - }, config) + await writeSitemap( + { + hostname: finalSiteUrl.href, + destinationDir: destDir, + publicBasePath: config.base, + sourceData: urlData, + limit: entryLimit, + }, + config + ); logger.info(`\`${OUTFILE}\` created at \`${path.relative(process.cwd(), destDir)}\``); } catch (err) { if (err instanceof ZodError) { diff --git a/packages/integrations/sitemap/src/write-sitemap.ts b/packages/integrations/sitemap/src/write-sitemap.ts index d55d4fc50b61..9993d7790bb3 100644 --- a/packages/integrations/sitemap/src/write-sitemap.ts +++ b/packages/integrations/sitemap/src/write-sitemap.ts @@ -1,69 +1,69 @@ +import { type WriteStream, createWriteStream } from 'fs'; import { normalize, resolve } from 'path'; -import { createWriteStream, type WriteStream } from 'fs' -import { mkdir } from 'fs/promises'; -import { promisify } from 'util'; import { Readable, pipeline } from 'stream'; -import replace from 'stream-replace-string' +import { promisify } from 'util'; +import { mkdir } from 'fs/promises'; +import replace from 'stream-replace-string'; import { SitemapAndIndexStream, SitemapStream } from 'sitemap'; import type { AstroConfig } from 'astro'; -import type { SitemapItem } from "./index.js"; +import type { SitemapItem } from './index.js'; type WriteSitemapConfig = { - hostname: string; - sitemapHostname?: string; - sourceData: SitemapItem[]; - destinationDir: string; - publicBasePath?: string; - limit?: number; -} + hostname: string; + sitemapHostname?: string; + sourceData: SitemapItem[]; + destinationDir: string; + publicBasePath?: string; + limit?: number; +}; // adapted from sitemap.js/sitemap-simple -export async function writeSitemap({ hostname, sitemapHostname = hostname, -sourceData, destinationDir, limit = 50000, publicBasePath = './', }: WriteSitemapConfig, astroConfig: AstroConfig) { +export async function writeSitemap( + { + hostname, + sitemapHostname = hostname, + sourceData, + destinationDir, + limit = 50000, + publicBasePath = './', + }: WriteSitemapConfig, + astroConfig: AstroConfig +) { + await mkdir(destinationDir, { recursive: true }); + + const sitemapAndIndexStream = new SitemapAndIndexStream({ + limit, + getSitemapStream: (i) => { + const sitemapStream = new SitemapStream({ + hostname, + }); + const path = `./sitemap-${i}.xml`; + const writePath = resolve(destinationDir, path); + if (!publicBasePath.endsWith('/')) { + publicBasePath += '/'; + } + const publicPath = normalize(publicBasePath + path); - await mkdir(destinationDir, { recursive: true }) + let stream: WriteStream; + if (astroConfig.trailingSlash === 'never' || astroConfig.build.format === 'file') { + // workaround for trailing slash issue in sitemap.js: https://github.com/ekalinin/sitemap.js/issues/403 + const host = hostname.endsWith('/') ? hostname.slice(0, -1) : hostname; + const searchStr = `${host}/`; + const replaceStr = `${host}`; + stream = sitemapStream + .pipe(replace(searchStr, replaceStr)) + .pipe(createWriteStream(writePath)); + } else { + stream = sitemapStream.pipe(createWriteStream(writePath)); + } - const sitemapAndIndexStream = new SitemapAndIndexStream({ - limit, - getSitemapStream: (i) => { - const sitemapStream = new SitemapStream({ - hostname, - }); - const path = `./sitemap-${i}.xml`; - const writePath = resolve(destinationDir, path); - if (!publicBasePath.endsWith('/')) { - publicBasePath += '/'; - } - const publicPath = normalize(publicBasePath + path); + return [new URL(publicPath, sitemapHostname).toString(), sitemapStream, stream]; + }, + }); - let stream: WriteStream - if (astroConfig.trailingSlash === 'never' || astroConfig.build.format === 'file') { - // workaround for trailing slash issue in sitemap.js: https://github.com/ekalinin/sitemap.js/issues/403 - const host = hostname.endsWith('/') ? hostname.slice(0, -1) : hostname - const searchStr = `${host}/` - const replaceStr = `${host}` - stream = sitemapStream.pipe(replace(searchStr, replaceStr)).pipe(createWriteStream(writePath)) - } else { - stream = sitemapStream.pipe(createWriteStream(writePath)) - } - - return [ - new URL( - publicPath, - sitemapHostname - ).toString(), - sitemapStream, - stream, - ]; - }, - }); - - let src = Readable.from(sourceData) - const indexPath = resolve( - destinationDir, - `./sitemap-index.xml` - ); - return promisify(pipeline)(src, sitemapAndIndexStream, createWriteStream(indexPath)); -} \ No newline at end of file + let src = Readable.from(sourceData); + const indexPath = resolve(destinationDir, `./sitemap-index.xml`); + return promisify(pipeline)(src, sitemapAndIndexStream, createWriteStream(indexPath)); +} From d515a74027950ead1c7c44738c849c1043f6e09c Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:10:13 +0530 Subject: [PATCH 88/96] optimization(runtime): create smaller objects for each Astro global (#10773) * optimization(runtime): create smaller objects for each Astro global * add changeset * Make slots lazy --------- Co-authored-by: bluwy --- .changeset/lazy-rats-beam.md | 5 ++ packages/astro/src/core/render-context.ts | 59 +++++++++++++++++++---- 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 .changeset/lazy-rats-beam.md diff --git a/.changeset/lazy-rats-beam.md b/.changeset/lazy-rats-beam.md new file mode 100644 index 000000000000..66acfe33f265 --- /dev/null +++ b/.changeset/lazy-rats-beam.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Improves performance for frequent use of small components. diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts index eb05df6f5db6..5cfc8ef2ede3 100644 --- a/packages/astro/src/core/render-context.ts +++ b/packages/astro/src/core/render-context.ts @@ -242,12 +242,57 @@ export class RenderContext { return result; } + #astroPagePartial?: Omit; + /** + * The Astro global is sourced in 3 different phases: + * - **Static**: `.generator` and `.glob` is printed by the compiler, instantiated once per process per astro file + * - **Page-level**: `.request`, `.cookies`, `.locals` etc. These remain the same for the duration of the request. + * - **Component-level**: `.props`, `.slots`, and `.self` are unique to each _use_ of each component. + * + * The page level partial is used as the prototype of the user-visible `Astro` global object, which is instantiated once per use of a component. + */ createAstro( result: SSRResult, - astroGlobalPartial: AstroGlobalPartial, + astroStaticPartial: AstroGlobalPartial, props: Record, slotValues: Record | null ): AstroGlobal { + // Create page partial with static partial so they can be cached together. + const astroPagePartial = (this.#astroPagePartial ??= this.createAstroPagePartial( + result, + astroStaticPartial + )); + // Create component-level partials. `Astro.self` is added by the compiler. + const astroComponentPartial = { props, self: null }; + + // Create final object. `Astro.slots` will be lazily created. + const Astro: Omit = Object.assign( + Object.create(astroPagePartial), + astroComponentPartial + ); + + // Handle `Astro.slots` + let _slots: AstroGlobal['slots']; + Object.defineProperty(Astro, 'slots', { + get: () => { + if (!_slots) { + _slots = new Slots( + result, + slotValues, + this.pipeline.logger + ) as unknown as AstroGlobal['slots']; + } + return _slots; + }, + }); + + return Astro as AstroGlobal; + } + + createAstroPagePartial( + result: SSRResult, + astroStaticPartial: AstroGlobalPartial + ): Omit { const renderContext = this; const { cookies, locals, params, pipeline, request, url } = this; const { response } = result; @@ -260,12 +305,10 @@ export class RenderContext { } return new Response(null, { status, headers: { Location: path } }); }; - const slots = new Slots(result, slotValues, pipeline.logger) as unknown as AstroGlobal['slots']; - // `Astro.self` is added by the compiler - const astroGlobalCombined: Omit = { - generator: astroGlobalPartial.generator, - glob: astroGlobalPartial.glob, + return { + generator: astroStaticPartial.generator, + glob: astroStaticPartial.glob, cookies, get clientAddress() { return renderContext.clientAddress(); @@ -280,17 +323,13 @@ export class RenderContext { get preferredLocaleList() { return renderContext.computePreferredLocaleList(); }, - props, locals, redirect, request, response, - slots, site: pipeline.site, url, }; - - return astroGlobalCombined as AstroGlobal; } clientAddress() { From 336c5c67ebec01f34eea11ed3f8b893c06424183 Mon Sep 17 00:00:00 2001 From: Avinash Reddy Date: Thu, 18 Apr 2024 14:33:36 +0530 Subject: [PATCH 89/96] add/cli: update list of integrations (#10811) --- .changeset/yellow-fishes-occur.md | 5 +++++ packages/astro/src/cli/add/index.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/yellow-fishes-occur.md diff --git a/.changeset/yellow-fishes-occur.md b/.changeset/yellow-fishes-occur.md new file mode 100644 index 000000000000..028412e5fc64 --- /dev/null +++ b/.changeset/yellow-fishes-occur.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Update list of available integrations in the `astro add` CLI help. diff --git a/packages/astro/src/cli/add/index.ts b/packages/astro/src/cli/add/index.ts index 2f8b73d560f1..c38ab57c1ddc 100644 --- a/packages/astro/src/cli/add/index.ts +++ b/packages/astro/src/cli/add/index.ts @@ -148,12 +148,12 @@ export async function add(names: string[], { flags }: AddOptions) { ['node', 'astro add node'], ], Others: [ + ['db', 'astro add db'], ['tailwind', 'astro add tailwind'], - ['image', 'astro add image'], ['mdx', 'astro add mdx'], + ['markdoc', 'astro add markdoc'], ['partytown', 'astro add partytown'], ['sitemap', 'astro add sitemap'], - ['prefetch', 'astro add prefetch'], ], }, description: `For more integrations, check out: ${cyan('https://astro.build/integrations')}`, From 6022f130de5fb267c0755c306c8ca039324a9db6 Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Thu, 18 Apr 2024 11:23:05 -0400 Subject: [PATCH 90/96] Invalidate CC cache manifest when lockfile or config changes (#10763) * Invalidate CC cache manifest when lockfile or config changes * Close the handle and increment manifest version * debug info * Provide a reason for cache busting * Handle compile metadata missing * Try it this way * Copy over cached assets as well * Only restore chunks when cache is valid * Better handle invalid caches * Explain when there is no content manifest * Add tests * debugging * Remove debugging * Update packages/astro/src/core/build/plugins/plugin-content.ts Co-authored-by: Bjorn Lu * Update packages/astro/src/core/build/plugins/plugin-content.ts Co-authored-by: Bjorn Lu * Review comments * Add chunks path constant --------- Co-authored-by: Bjorn Lu --- .changeset/metal-terms-push.md | 5 + packages/astro/src/@types/astro.ts | 1 + packages/astro/src/core/build/consts.ts | 1 + packages/astro/src/core/build/index.ts | 1 + packages/astro/src/core/build/internal.ts | 2 + .../src/core/build/plugins/plugin-content.ts | 191 +++++++++++++++--- packages/astro/src/core/build/static-build.ts | 5 +- packages/astro/src/core/config/config.ts | 20 +- packages/astro/src/core/config/index.ts | 2 +- packages/astro/src/integrations/index.ts | 4 +- packages/astro/src/vite-plugin-astro/index.ts | 22 +- ...ent-collections-cache-invalidation.test.js | 98 +++++++++ .../.gitignore | 1 + .../astro.config.mjs | 12 ++ .../lockfile-mismatch/content/manifest.json | 1 + .../version-mismatch/content/manifest.json | 1 + .../package.json | 8 + .../src/content/blog/one.md | 5 + .../src/content/config.ts | 10 + .../src/pages/index.astro | 10 + pnpm-lock.yaml | 6 + 21 files changed, 355 insertions(+), 51 deletions(-) create mode 100644 .changeset/metal-terms-push.md create mode 100644 packages/astro/src/core/build/consts.ts create mode 100644 packages/astro/test/experimental-content-collections-cache-invalidation.test.js create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/package.json create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts create mode 100644 packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro diff --git a/.changeset/metal-terms-push.md b/.changeset/metal-terms-push.md new file mode 100644 index 000000000000..d9cbf378b38a --- /dev/null +++ b/.changeset/metal-terms-push.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Invalidate CC cache manifest when lockfile or config changes diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 21630ec1e2e9..52bf7d397caa 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -2779,6 +2779,7 @@ export interface AstroIntegration { dir: URL; routes: RouteData[]; logger: AstroIntegrationLogger; + cacheManifest: boolean; }) => void | Promise; }; } diff --git a/packages/astro/src/core/build/consts.ts b/packages/astro/src/core/build/consts.ts new file mode 100644 index 000000000000..bf3162fc4b92 --- /dev/null +++ b/packages/astro/src/core/build/consts.ts @@ -0,0 +1 @@ +export const CHUNKS_PATH = 'chunks/'; diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index d77e69fd2726..2b71feaf9a9a 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -218,6 +218,7 @@ class AstroBuilder { .flat() .map((pageData) => pageData.route), logging: this.logger, + cacheManifest: internals.cacheManifestUsed, }); if (this.logger.level && levels[this.logger.level()] <= levels['info']) { diff --git a/packages/astro/src/core/build/internal.ts b/packages/astro/src/core/build/internal.ts index c2c53df11f33..a5e456627155 100644 --- a/packages/astro/src/core/build/internal.ts +++ b/packages/astro/src/core/build/internal.ts @@ -89,6 +89,7 @@ export interface BuildInternals { discoveredScripts: Set; cachedClientEntries: string[]; + cacheManifestUsed: boolean; propagatedStylesMap: Map>; propagatedScriptsMap: Map>; @@ -140,6 +141,7 @@ export function createBuildInternals(): BuildInternals { componentMetadata: new Map(), ssrSplitEntryChunks: new Map(), entryPoints: new Map(), + cacheManifestUsed: false, }; } diff --git a/packages/astro/src/core/build/plugins/plugin-content.ts b/packages/astro/src/core/build/plugins/plugin-content.ts index f9c9ba7e4b5e..ce11359d8325 100644 --- a/packages/astro/src/core/build/plugins/plugin-content.ts +++ b/packages/astro/src/core/build/plugins/plugin-content.ts @@ -3,6 +3,7 @@ import fsMod from 'node:fs'; import { fileURLToPath } from 'node:url'; import pLimit from 'p-limit'; import { type Plugin as VitePlugin, normalizePath } from 'vite'; +import { configPaths } from '../../config/index.js'; import { CONTENT_RENDER_FLAG, PROPAGATED_ASSET_FLAG } from '../../../content/consts.js'; import { type ContentLookupMap, hasContentFlag } from '../../../content/utils.js'; import { @@ -10,7 +11,7 @@ import { generateLookupMap, } from '../../../content/vite-plugin-content-virtual-mod.js'; import { isServerLikeOutput } from '../../../prerender/utils.js'; -import { joinPaths, removeFileExtension, removeLeadingForwardSlash } from '../../path.js'; +import { joinPaths, removeFileExtension, removeLeadingForwardSlash, appendForwardSlash } from '../../path.js'; import { addRollupInput } from '../add-rollup-input.js'; import { type BuildInternals } from '../internal.js'; import type { AstroBuildPlugin } from '../plugin.js'; @@ -18,12 +19,14 @@ import { copyFiles } from '../static-build.js'; import type { StaticBuildOptions } from '../types.js'; import { encodeName } from '../util.js'; import { extendManualChunks } from './util.js'; +import { emptyDir } from '../../fs/index.js'; +import { CHUNKS_PATH } from '../consts.js'; const CONTENT_CACHE_DIR = './content/'; const CONTENT_MANIFEST_FILE = './manifest.json'; // IMPORTANT: Update this version when making significant changes to the manifest format. // Only manifests generated with the same version number can be compared. -const CONTENT_MANIFEST_VERSION = 0; +const CONTENT_MANIFEST_VERSION = 1; interface ContentManifestKey { collection: string; @@ -39,40 +42,44 @@ interface ContentManifest { // Tracks components that should be passed to the client build // When the cache is restored, these might no longer be referenced clientEntries: string[]; + // Hash of the lockfiles, pnpm-lock.yaml, package-lock.json, etc. + // Kept so that installing new packages results in a full rebuild. + lockfiles: string; + // Hash of the Astro config. Changing options results in invalidating the cache. + configs: string; } const virtualEmptyModuleId = `virtual:empty-content`; const resolvedVirtualEmptyModuleId = `\0${virtualEmptyModuleId}`; +const NO_MANIFEST_VERSION = -1 as const; function createContentManifest(): ContentManifest { - return { version: -1, entries: [], serverEntries: [], clientEntries: [] }; + return { version: NO_MANIFEST_VERSION, entries: [], serverEntries: [], clientEntries: [], lockfiles: "", configs: "" }; } function vitePluginContent( opts: StaticBuildOptions, lookupMap: ContentLookupMap, - internals: BuildInternals + internals: BuildInternals, + cachedBuildOutput: Array<{ cached: URL; dist: URL; }> ): VitePlugin { const { config } = opts.settings; const { cacheDir } = config; const distRoot = config.outDir; const distContentRoot = new URL('./content/', distRoot); - const cachedChunks = new URL('./chunks/', opts.settings.config.cacheDir); - const distChunks = new URL('./chunks/', opts.settings.config.outDir); const contentCacheDir = new URL(CONTENT_CACHE_DIR, cacheDir); const contentManifestFile = new URL(CONTENT_MANIFEST_FILE, contentCacheDir); - const cache = contentCacheDir; - const cacheTmp = new URL('./.tmp/', cache); + const cacheTmp = new URL('./.tmp/', contentCacheDir); let oldManifest = createContentManifest(); let newManifest = createContentManifest(); let entries: ContentEntries; let injectedEmptyFile = false; + let currentManifestState: ReturnType = 'valid'; if (fsMod.existsSync(contentManifestFile)) { try { const data = fsMod.readFileSync(contentManifestFile, { encoding: 'utf8' }); oldManifest = JSON.parse(data); - internals.cachedClientEntries = oldManifest.clientEntries; } catch {} } @@ -84,6 +91,32 @@ function vitePluginContent( newManifest = await generateContentManifest(opts, lookupMap); entries = getEntriesFromManifests(oldManifest, newManifest); + // If the manifest is valid, use the cached client entries as nothing has changed + currentManifestState = manifestState(oldManifest, newManifest); + if(currentManifestState === 'valid') { + internals.cachedClientEntries = oldManifest.clientEntries; + } else { + let logReason = ''; + switch(currentManifestState) { + case 'config-mismatch': + logReason = 'Astro config has changed'; + break; + case 'lockfile-mismatch': + logReason = 'Lockfiles have changed'; + break; + case 'no-entries': + logReason = 'No content collections entries cached'; + break; + case 'version-mismatch': + logReason = 'The cache manifest version has changed'; + break; + case 'no-manifest': + logReason = 'No content manifest was found in the cache'; + break; + } + opts.logger.info('build', `Cache invalid, rebuilding from source. Reason: ${logReason}.`); + } + // Of the cached entries, these ones need to be rebuilt for (const { type, entry } of entries.buildFromSource) { const fileURL = encodeURI(joinPaths(opts.settings.config.root.toString(), entry)); @@ -96,10 +129,18 @@ function vitePluginContent( } newOptions = addRollupInput(newOptions, inputs); } - // Restores cached chunks from the previous build - if (fsMod.existsSync(cachedChunks)) { - await copyFiles(cachedChunks, distChunks, true); + + // Restores cached chunks and assets from the previous build + // If the manifest state is not valid then it needs to rebuild everything + // so don't do that in this case. + if(currentManifestState === 'valid') { + for(const { cached, dist } of cachedBuildOutput) { + if (fsMod.existsSync(cached)) { + await copyFiles(cached, dist, true); + } + } } + // If nothing needs to be rebuilt, we inject a fake entrypoint to appease Rollup if (entries.buildFromSource.length === 0) { newOptions = addRollupInput(newOptions, [virtualEmptyModuleId]); @@ -199,16 +240,20 @@ function vitePluginContent( ]); newManifest.serverEntries = Array.from(serverComponents); newManifest.clientEntries = Array.from(clientComponents); + + const cacheExists = fsMod.existsSync(contentCacheDir); + // If the manifest is invalid, empty the cache so that we can create a new one. + if(cacheExists && currentManifestState !== 'valid') { + emptyDir(contentCacheDir); + } + await fsMod.promises.mkdir(contentCacheDir, { recursive: true }); await fsMod.promises.writeFile(contentManifestFile, JSON.stringify(newManifest), { encoding: 'utf8', }); - - const cacheExists = fsMod.existsSync(cache); - fsMod.mkdirSync(cache, { recursive: true }); await fsMod.promises.mkdir(cacheTmp, { recursive: true }); await copyFiles(distContentRoot, cacheTmp, true); - if (cacheExists) { + if (cacheExists && currentManifestState === 'valid') { await copyFiles(contentCacheDir, distContentRoot, false); } await copyFiles(cacheTmp, contentCacheDir); @@ -242,12 +287,12 @@ function getEntriesFromManifests( oldManifest: ContentManifest, newManifest: ContentManifest ): ContentEntries { - const { version: oldVersion, entries: oldEntries } = oldManifest; - const { version: newVersion, entries: newEntries } = newManifest; + const { entries: oldEntries } = oldManifest; + const { entries: newEntries } = newManifest; let entries: ContentEntries = { restoreFromCache: [], buildFromSource: [] }; const newEntryMap = new Map(newEntries); - if (oldVersion !== newVersion || oldEntries.length === 0) { + if (manifestState(oldManifest, newManifest) !== 'valid') { entries.buildFromSource = Array.from(newEntryMap.keys()); return entries; } @@ -265,16 +310,37 @@ function getEntriesFromManifests( return entries; } +type ManifestState = 'valid' | 'no-manifest' | 'version-mismatch' | 'no-entries' | 'lockfile-mismatch' | 'config-mismatch'; + +function manifestState(oldManifest: ContentManifest, newManifest: ContentManifest): ManifestState { + // There isn't an existing manifest. + if(oldManifest.version === NO_MANIFEST_VERSION) { + return 'no-manifest'; + } + // Version mismatch, always invalid + if (oldManifest.version !== newManifest.version) { + return 'version-mismatch'; + } + if(oldManifest.entries.length === 0) { + return 'no-entries'; + } + // Lockfiles have changed or there is no lockfile at all. + if((oldManifest.lockfiles !== newManifest.lockfiles) || newManifest.lockfiles === '') { + return 'lockfile-mismatch'; + } + // Config has changed. + if(oldManifest.configs !== newManifest.configs) { + return 'config-mismatch'; + } + return 'valid'; +} + async function generateContentManifest( opts: StaticBuildOptions, lookupMap: ContentLookupMap ): Promise { - let manifest: ContentManifest = { - version: CONTENT_MANIFEST_VERSION, - entries: [], - serverEntries: [], - clientEntries: [], - }; + let manifest = createContentManifest(); + manifest.version = CONTENT_MANIFEST_VERSION; const limit = pLimit(10); const promises: Promise[] = []; @@ -290,13 +356,63 @@ async function generateContentManifest( ); } } + + const [lockfiles, configs] = await Promise.all([ + lockfilesHash(opts.settings.config.root), + configHash(opts.settings.config.root) + ]); + + manifest.lockfiles = lockfiles; + manifest.configs = configs; await Promise.all(promises); return manifest; } -function checksum(data: string): string { - return createHash('sha1').update(data).digest('base64'); +async function pushBufferInto(fileURL: URL, buffers: Uint8Array[]) { + try { + const handle = await fsMod.promises.open(fileURL, 'r'); + const data = await handle.readFile(); + buffers.push(data); + await handle.close(); + } catch { + // File doesn't exist, ignore + } +} + +async function lockfilesHash(root: URL) { + // Order is important so don't change this. + const lockfiles = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lockb']; + const datas: Uint8Array[] = []; + const promises: Promise[] = []; + for(const lockfileName of lockfiles) { + const fileURL = new URL(`./${lockfileName}`, root); + promises.push(pushBufferInto(fileURL, datas)); + } + await Promise.all(promises); + return checksum(...datas); +} + +async function configHash(root: URL) { + const configFileNames = configPaths; + for(const configPath of configFileNames) { + try { + const fileURL = new URL(`./${configPath}`, root); + const data = await fsMod.promises.readFile(fileURL); + const hash = checksum(data); + return hash; + } catch { + // File doesn't exist + } + } + // No config file, still create a hash since we can compare nothing against nothing. + return checksum(`export default {}`); +} + +function checksum(...datas: string[] | Uint8Array[]): string { + const hash = createHash('sha1'); + datas.forEach(data => hash.update(data)); + return hash.digest('base64'); } function collectionTypeToFlag(type: 'content' | 'data') { @@ -308,8 +424,15 @@ export function pluginContent( opts: StaticBuildOptions, internals: BuildInternals ): AstroBuildPlugin { - const cachedChunks = new URL('./chunks/', opts.settings.config.cacheDir); - const distChunks = new URL('./chunks/', opts.settings.config.outDir); + const { cacheDir, outDir } = opts.settings.config; + + const chunksFolder = './' + CHUNKS_PATH; + const assetsFolder = './' + appendForwardSlash(opts.settings.config.build.assets); + // These are build output that is kept in the cache. + const cachedBuildOutput = [ + { cached: new URL(chunksFolder, cacheDir), dist: new URL(chunksFolder, outDir) }, + { cached: new URL(assetsFolder, cacheDir), dist: new URL(assetsFolder, outDir) }, + ]; return { targets: ['server'], @@ -321,10 +444,9 @@ export function pluginContent( if (isServerLikeOutput(opts.settings.config)) { return { vitePlugin: undefined }; } - const lookupMap = await generateLookupMap({ settings: opts.settings, fs: fsMod }); return { - vitePlugin: vitePluginContent(opts, lookupMap, internals), + vitePlugin: vitePluginContent(opts, lookupMap, internals, cachedBuildOutput), }; }, @@ -335,8 +457,11 @@ export function pluginContent( if (isServerLikeOutput(opts.settings.config)) { return; } - if (fsMod.existsSync(distChunks)) { - await copyFiles(distChunks, cachedChunks, true); + // Cache build output of chunks and assets + for(const { cached, dist } of cachedBuildOutput) { + if (fsMod.existsSync(dist)) { + await copyFiles(dist, cached, true); + } } }, }, diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index 5eebc5429e7b..ede0e36e35a4 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -34,6 +34,7 @@ import { RESOLVED_SPLIT_MODULE_ID, RESOLVED_SSR_VIRTUAL_MODULE_ID } from './plug import { ASTRO_PAGE_EXTENSION_POST_PATTERN } from './plugins/util.js'; import type { StaticBuildOptions } from './types.js'; import { encodeName, getTimeStat, viteBuildReturnToRollupOutputs } from './util.js'; +import { CHUNKS_PATH } from './consts.js'; export async function viteBuild(opts: StaticBuildOptions) { const { allPages, settings } = opts; @@ -196,7 +197,7 @@ async function ssrBuild( // We need to keep these separate chunkFileNames(chunkInfo) { const { name } = chunkInfo; - let prefix = 'chunks/'; + let prefix = CHUNKS_PATH; let suffix = '_[hash].mjs'; if (isContentCache) { @@ -454,7 +455,7 @@ export async function copyFiles(fromFolder: URL, toFolder: URL, includeDotfiles dot: includeDotfiles, }); if (files.length === 0) return; - await Promise.all( + return await Promise.all( files.map(async function copyFile(filename) { const from = new URL(filename, fromFolder); const to = new URL(filename, toFolder); diff --git a/packages/astro/src/core/config/config.ts b/packages/astro/src/core/config/config.ts index f4ce1172017d..5bb2eda77287 100644 --- a/packages/astro/src/core/config/config.ts +++ b/packages/astro/src/core/config/config.ts @@ -78,15 +78,19 @@ export function resolveRoot(cwd?: string | URL): string { return cwd ? path.resolve(cwd) : process.cwd(); } +// Config paths to search for. In order of likely appearance +// to speed up the check. +export const configPaths = Object.freeze([ + 'astro.config.mjs', + 'astro.config.js', + 'astro.config.ts', + 'astro.config.mts', + 'astro.config.cjs', + 'astro.config.cts', +]); + async function search(fsMod: typeof fs, root: string) { - const paths = [ - 'astro.config.mjs', - 'astro.config.js', - 'astro.config.ts', - 'astro.config.mts', - 'astro.config.cjs', - 'astro.config.cts', - ].map((p) => path.join(root, p)); + const paths = configPaths.map((p) => path.join(root, p)); for (const file of paths) { if (fsMod.existsSync(file)) { diff --git a/packages/astro/src/core/config/index.ts b/packages/astro/src/core/config/index.ts index 4bb1f05378f2..0f697ddd608d 100644 --- a/packages/astro/src/core/config/index.ts +++ b/packages/astro/src/core/config/index.ts @@ -1,4 +1,4 @@ -export { resolveConfig, resolveConfigPath, resolveFlags, resolveRoot } from './config.js'; +export { configPaths, resolveConfig, resolveConfigPath, resolveFlags, resolveRoot } from './config.js'; export { createNodeLogger } from './logging.js'; export { mergeConfig } from './merge.js'; export type { AstroConfigType } from './schema.js'; diff --git a/packages/astro/src/integrations/index.ts b/packages/astro/src/integrations/index.ts index 88072b20dd4f..7603f24a6065 100644 --- a/packages/astro/src/integrations/index.ts +++ b/packages/astro/src/integrations/index.ts @@ -477,9 +477,10 @@ type RunHookBuildDone = { pages: string[]; routes: RouteData[]; logging: Logger; + cacheManifest: boolean; }; -export async function runHookBuildDone({ config, pages, routes, logging }: RunHookBuildDone) { +export async function runHookBuildDone({ config, pages, routes, logging, cacheManifest }: RunHookBuildDone) { const dir = isServerLikeOutput(config) ? config.build.client : config.outDir; await fs.promises.mkdir(dir, { recursive: true }); @@ -495,6 +496,7 @@ export async function runHookBuildDone({ config, pages, routes, logging }: RunHo dir, routes, logger, + cacheManifest, }), logger: logging, }); diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index 2f4e256b760b..c33f5dd0c768 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -89,12 +89,22 @@ export default function astro({ settings, logger }: AstroPluginOptions): vite.Pl // modules are compiled first, then its virtual modules. const filename = normalizePath(normalizeFilename(parsedId.filename, config.root)); let compileMetadata = astroFileToCompileMetadata.get(filename); - // If `compileMetadata` doesn't exist in dev, that means the virtual module may have been invalidated. - // We try to re-compile the main Astro module (`filename`) first before retrieving the metadata again. - if (!compileMetadata && server) { - const code = await loadId(server.pluginContainer, filename); - // `compile` should re-set `filename` in `astroFileToCompileMetadata` - if (code != null) await compile(code, filename); + if (!compileMetadata) { + // If `compileMetadata` doesn't exist in dev, that means the virtual module may have been invalidated. + // We try to re-compile the main Astro module (`filename`) first before retrieving the metadata again. + if(server) { + const code = await loadId(server.pluginContainer, filename); + // `compile` should re-set `filename` in `astroFileToCompileMetadata` + if (code != null) await compile(code, filename); + } + // When cached we might load client-side scripts during the build + else if(config.experimental.contentCollectionCache) { + await this.load({ + id: filename, + resolveDependencies: false, + }); + } + compileMetadata = astroFileToCompileMetadata.get(filename); } // If the metadata still doesn't exist, that means the virtual modules are somehow compiled first, diff --git a/packages/astro/test/experimental-content-collections-cache-invalidation.test.js b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js new file mode 100644 index 000000000000..5ec688a91ba1 --- /dev/null +++ b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js @@ -0,0 +1,98 @@ +import assert from 'node:assert/strict'; +import { after, before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; +import fs from 'node:fs'; +import { copyFiles } from '../dist/core/build/static-build.js'; + +describe('Experimental Content Collections cache - invalidation', () => { + class CacheBackup { + constructor(root, relCacheDir) { + this.root = new URL(root, import.meta.url); + this.cacheDir = new URL(relCacheDir, this.root); + this.tmpDir = new URL(`./tmp` + relCacheDir.slice(1), this.root); + } + backup() { + this.rmTmp(); + copyFiles(this.cacheDir, this.tmpDir); + } + restore() { + fs.rmSync(this.cacheDir, { recursive: true }); + copyFiles(this.tmpDir, this.cacheDir); + } + rmTmp() { + fs.rmSync(this.tmpDir, { force: true, recursive: true }); + } + } + + class ManifestTestPlugin { + used = false; + plugin() { + return { + name: '@test/manifest-used', + hooks: { + 'astro:build:done': ({ cacheManifest }) => { + this.used = cacheManifest; + } + } + } + } + } + + describe('manifest version', () => { + let fixture, backup, + /** @type {ManifestTestPlugin} */ + testPlugin; + before(async () => { + testPlugin = new ManifestTestPlugin(); + fixture = await loadFixture({ + root: './fixtures/content-collections-cache-invalidation/', + cacheDir: './cache/version-mismatch/', + experimental: { contentCollectionCache: true }, + integrations: [ + testPlugin.plugin() + ] + }); + backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/version-mismatch/'); + backup.backup(); + await fixture.build(); + }); + + after(async () => { + backup.restore(); + //await fixture.clean(); + }); + + it('Manifest was not used', () => { + assert.equal(testPlugin.used, false, 'manifest not used because of version mismatch'); + }); + }); + + describe('lockfiles', () => { + let fixture, backup, + /** @type {ManifestTestPlugin} */ + testPlugin; + before(async () => { + testPlugin = new ManifestTestPlugin(); + fixture = await loadFixture({ + root: './fixtures/content-collections-cache-invalidation/', + cacheDir: './cache/lockfile-mismatch/', + experimental: { contentCollectionCache: true }, + integrations: [ + testPlugin.plugin() + ] + }); + backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/lockfile-mismatch/'); + backup.backup(); + await fixture.build(); + }); + + after(async () => { + backup.restore(); + //await fixture.clean(); + }); + + it('Manifest was not used', () => { + assert.equal(testPlugin.used, false, 'manifest not used because of lockfile mismatch'); + }); + }); +}); diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore b/packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore new file mode 100644 index 000000000000..3fec32c84275 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/.gitignore @@ -0,0 +1 @@ +tmp/ diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs b/packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs new file mode 100644 index 000000000000..a74151f32bd2 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/astro.config.mjs @@ -0,0 +1,12 @@ +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({ + base: '/docs', + compressHTML: false, + vite: { + build: { + assetsInlineLimit: 0, + } + } +}); diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json new file mode 100644 index 000000000000..6b5f19749834 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/lockfile-mismatch/content/manifest.json @@ -0,0 +1 @@ +{"version":1,"entries":[[{"collection":"blog","type":"content","entry":"/src/content/blog/one.md"},"No8AlxYwy8HK3dH9W3Mj/6SeHMI="]],"serverEntries":[],"clientEntries":[],"lockfiles":"2jmj7l5rSw0yVb/vlWAYkK/YBwk=","configs":"h80ch7FwzpG2BXKQM39ZqFpU3dg="} \ No newline at end of file diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json new file mode 100644 index 000000000000..20a905210dfa --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/cache/version-mismatch/content/manifest.json @@ -0,0 +1 @@ +{"version":1111111,"entries":[[{"collection":"blog","type":"content","entry":"/src/content/blog/one.md"},"No8AlxYwy8HK3dH9W3Mj/6SeHMI="]],"serverEntries":[],"clientEntries":[],"lockfiles":"2jmj7l5rSw0yVb/vlWAYkK/YBwk=","configs":"h80ch7FwzpG2BXKQM39ZqFpU3dg="} diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/package.json b/packages/astro/test/fixtures/content-collections-cache-invalidation/package.json new file mode 100644 index 000000000000..865550ef33b8 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/content-collections-cache-invalidation", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md new file mode 100644 index 000000000000..fec6f5277ecf --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/blog/one.md @@ -0,0 +1,5 @@ +--- +title: One +--- + +Hello world diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts new file mode 100644 index 000000000000..db96db2eaa95 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/content/config.ts @@ -0,0 +1,10 @@ +import { defineCollection, z } from 'astro:content'; + +const blog = defineCollection({ + type: 'collection', + schema: z.object({ + title: z.string() + }) +}); + +export const collections = { blog }; diff --git a/packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro new file mode 100644 index 000000000000..e06d49b853b1 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections-cache-invalidation/src/pages/index.astro @@ -0,0 +1,10 @@ +--- +--- + + + Testing + + +

Testing

+ + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ada46bae03a0..12dceba0da69 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2466,6 +2466,12 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/content-collections-cache-invalidation: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/content-collections-empty-dir: dependencies: astro: From 386d9609e5cffb153d4f6c83e6c23b511c443d6a Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Thu, 18 Apr 2024 15:24:04 +0000 Subject: [PATCH 91/96] [ci] format --- .../src/core/build/plugins/plugin-content.ts | 62 ++++++++++++------- packages/astro/src/core/build/static-build.ts | 2 +- packages/astro/src/core/config/index.ts | 8 ++- packages/astro/src/integrations/index.ts | 8 ++- packages/astro/src/vite-plugin-astro/index.ts | 4 +- ...ent-collections-cache-invalidation.test.js | 42 +++++++------ 6 files changed, 80 insertions(+), 46 deletions(-) diff --git a/packages/astro/src/core/build/plugins/plugin-content.ts b/packages/astro/src/core/build/plugins/plugin-content.ts index ce11359d8325..24512f8ebc8e 100644 --- a/packages/astro/src/core/build/plugins/plugin-content.ts +++ b/packages/astro/src/core/build/plugins/plugin-content.ts @@ -3,7 +3,6 @@ import fsMod from 'node:fs'; import { fileURLToPath } from 'node:url'; import pLimit from 'p-limit'; import { type Plugin as VitePlugin, normalizePath } from 'vite'; -import { configPaths } from '../../config/index.js'; import { CONTENT_RENDER_FLAG, PROPAGATED_ASSET_FLAG } from '../../../content/consts.js'; import { type ContentLookupMap, hasContentFlag } from '../../../content/utils.js'; import { @@ -11,16 +10,22 @@ import { generateLookupMap, } from '../../../content/vite-plugin-content-virtual-mod.js'; import { isServerLikeOutput } from '../../../prerender/utils.js'; -import { joinPaths, removeFileExtension, removeLeadingForwardSlash, appendForwardSlash } from '../../path.js'; +import { configPaths } from '../../config/index.js'; +import { emptyDir } from '../../fs/index.js'; +import { + appendForwardSlash, + joinPaths, + removeFileExtension, + removeLeadingForwardSlash, +} from '../../path.js'; import { addRollupInput } from '../add-rollup-input.js'; +import { CHUNKS_PATH } from '../consts.js'; import { type BuildInternals } from '../internal.js'; import type { AstroBuildPlugin } from '../plugin.js'; import { copyFiles } from '../static-build.js'; import type { StaticBuildOptions } from '../types.js'; import { encodeName } from '../util.js'; import { extendManualChunks } from './util.js'; -import { emptyDir } from '../../fs/index.js'; -import { CHUNKS_PATH } from '../consts.js'; const CONTENT_CACHE_DIR = './content/'; const CONTENT_MANIFEST_FILE = './manifest.json'; @@ -54,14 +59,21 @@ const resolvedVirtualEmptyModuleId = `\0${virtualEmptyModuleId}`; const NO_MANIFEST_VERSION = -1 as const; function createContentManifest(): ContentManifest { - return { version: NO_MANIFEST_VERSION, entries: [], serverEntries: [], clientEntries: [], lockfiles: "", configs: "" }; + return { + version: NO_MANIFEST_VERSION, + entries: [], + serverEntries: [], + clientEntries: [], + lockfiles: '', + configs: '', + }; } function vitePluginContent( opts: StaticBuildOptions, lookupMap: ContentLookupMap, internals: BuildInternals, - cachedBuildOutput: Array<{ cached: URL; dist: URL; }> + cachedBuildOutput: Array<{ cached: URL; dist: URL }> ): VitePlugin { const { config } = opts.settings; const { cacheDir } = config; @@ -93,11 +105,11 @@ function vitePluginContent( // If the manifest is valid, use the cached client entries as nothing has changed currentManifestState = manifestState(oldManifest, newManifest); - if(currentManifestState === 'valid') { + if (currentManifestState === 'valid') { internals.cachedClientEntries = oldManifest.clientEntries; } else { let logReason = ''; - switch(currentManifestState) { + switch (currentManifestState) { case 'config-mismatch': logReason = 'Astro config has changed'; break; @@ -133,8 +145,8 @@ function vitePluginContent( // Restores cached chunks and assets from the previous build // If the manifest state is not valid then it needs to rebuild everything // so don't do that in this case. - if(currentManifestState === 'valid') { - for(const { cached, dist } of cachedBuildOutput) { + if (currentManifestState === 'valid') { + for (const { cached, dist } of cachedBuildOutput) { if (fsMod.existsSync(cached)) { await copyFiles(cached, dist, true); } @@ -243,7 +255,7 @@ function vitePluginContent( const cacheExists = fsMod.existsSync(contentCacheDir); // If the manifest is invalid, empty the cache so that we can create a new one. - if(cacheExists && currentManifestState !== 'valid') { + if (cacheExists && currentManifestState !== 'valid') { emptyDir(contentCacheDir); } @@ -310,26 +322,32 @@ function getEntriesFromManifests( return entries; } -type ManifestState = 'valid' | 'no-manifest' | 'version-mismatch' | 'no-entries' | 'lockfile-mismatch' | 'config-mismatch'; +type ManifestState = + | 'valid' + | 'no-manifest' + | 'version-mismatch' + | 'no-entries' + | 'lockfile-mismatch' + | 'config-mismatch'; function manifestState(oldManifest: ContentManifest, newManifest: ContentManifest): ManifestState { // There isn't an existing manifest. - if(oldManifest.version === NO_MANIFEST_VERSION) { + if (oldManifest.version === NO_MANIFEST_VERSION) { return 'no-manifest'; } // Version mismatch, always invalid if (oldManifest.version !== newManifest.version) { return 'version-mismatch'; } - if(oldManifest.entries.length === 0) { + if (oldManifest.entries.length === 0) { return 'no-entries'; } // Lockfiles have changed or there is no lockfile at all. - if((oldManifest.lockfiles !== newManifest.lockfiles) || newManifest.lockfiles === '') { + if (oldManifest.lockfiles !== newManifest.lockfiles || newManifest.lockfiles === '') { return 'lockfile-mismatch'; } // Config has changed. - if(oldManifest.configs !== newManifest.configs) { + if (oldManifest.configs !== newManifest.configs) { return 'config-mismatch'; } return 'valid'; @@ -356,10 +374,10 @@ async function generateContentManifest( ); } } - + const [lockfiles, configs] = await Promise.all([ lockfilesHash(opts.settings.config.root), - configHash(opts.settings.config.root) + configHash(opts.settings.config.root), ]); manifest.lockfiles = lockfiles; @@ -385,7 +403,7 @@ async function lockfilesHash(root: URL) { const lockfiles = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lockb']; const datas: Uint8Array[] = []; const promises: Promise[] = []; - for(const lockfileName of lockfiles) { + for (const lockfileName of lockfiles) { const fileURL = new URL(`./${lockfileName}`, root); promises.push(pushBufferInto(fileURL, datas)); } @@ -395,7 +413,7 @@ async function lockfilesHash(root: URL) { async function configHash(root: URL) { const configFileNames = configPaths; - for(const configPath of configFileNames) { + for (const configPath of configFileNames) { try { const fileURL = new URL(`./${configPath}`, root); const data = await fsMod.promises.readFile(fileURL); @@ -411,7 +429,7 @@ async function configHash(root: URL) { function checksum(...datas: string[] | Uint8Array[]): string { const hash = createHash('sha1'); - datas.forEach(data => hash.update(data)); + datas.forEach((data) => hash.update(data)); return hash.digest('base64'); } @@ -458,7 +476,7 @@ export function pluginContent( return; } // Cache build output of chunks and assets - for(const { cached, dist } of cachedBuildOutput) { + for (const { cached, dist } of cachedBuildOutput) { if (fsMod.existsSync(dist)) { await copyFiles(dist, cached, true); } diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index ede0e36e35a4..cdd24e1c0053 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -23,6 +23,7 @@ import { PAGE_SCRIPT_ID } from '../../vite-plugin-scripts/index.js'; import { AstroError, AstroErrorData } from '../errors/index.js'; import { routeIsRedirect } from '../redirects/index.js'; import { getOutDirWithinCwd } from './common.js'; +import { CHUNKS_PATH } from './consts.js'; import { generatePages } from './generate.js'; import { trackPageData } from './internal.js'; import { type AstroBuildPluginContainer, createPluginContainer } from './plugin.js'; @@ -34,7 +35,6 @@ import { RESOLVED_SPLIT_MODULE_ID, RESOLVED_SSR_VIRTUAL_MODULE_ID } from './plug import { ASTRO_PAGE_EXTENSION_POST_PATTERN } from './plugins/util.js'; import type { StaticBuildOptions } from './types.js'; import { encodeName, getTimeStat, viteBuildReturnToRollupOutputs } from './util.js'; -import { CHUNKS_PATH } from './consts.js'; export async function viteBuild(opts: StaticBuildOptions) { const { allPages, settings } = opts; diff --git a/packages/astro/src/core/config/index.ts b/packages/astro/src/core/config/index.ts index 0f697ddd608d..3beaa5663523 100644 --- a/packages/astro/src/core/config/index.ts +++ b/packages/astro/src/core/config/index.ts @@ -1,4 +1,10 @@ -export { configPaths, resolveConfig, resolveConfigPath, resolveFlags, resolveRoot } from './config.js'; +export { + configPaths, + resolveConfig, + resolveConfigPath, + resolveFlags, + resolveRoot, +} from './config.js'; export { createNodeLogger } from './logging.js'; export { mergeConfig } from './merge.js'; export type { AstroConfigType } from './schema.js'; diff --git a/packages/astro/src/integrations/index.ts b/packages/astro/src/integrations/index.ts index 7603f24a6065..81901737e931 100644 --- a/packages/astro/src/integrations/index.ts +++ b/packages/astro/src/integrations/index.ts @@ -480,7 +480,13 @@ type RunHookBuildDone = { cacheManifest: boolean; }; -export async function runHookBuildDone({ config, pages, routes, logging, cacheManifest }: RunHookBuildDone) { +export async function runHookBuildDone({ + config, + pages, + routes, + logging, + cacheManifest, +}: RunHookBuildDone) { const dir = isServerLikeOutput(config) ? config.build.client : config.outDir; await fs.promises.mkdir(dir, { recursive: true }); diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts index c33f5dd0c768..9d6367b99d0f 100644 --- a/packages/astro/src/vite-plugin-astro/index.ts +++ b/packages/astro/src/vite-plugin-astro/index.ts @@ -92,13 +92,13 @@ export default function astro({ settings, logger }: AstroPluginOptions): vite.Pl if (!compileMetadata) { // If `compileMetadata` doesn't exist in dev, that means the virtual module may have been invalidated. // We try to re-compile the main Astro module (`filename`) first before retrieving the metadata again. - if(server) { + if (server) { const code = await loadId(server.pluginContainer, filename); // `compile` should re-set `filename` in `astroFileToCompileMetadata` if (code != null) await compile(code, filename); } // When cached we might load client-side scripts during the build - else if(config.experimental.contentCollectionCache) { + else if (config.experimental.contentCollectionCache) { await this.load({ id: filename, resolveDependencies: false, diff --git a/packages/astro/test/experimental-content-collections-cache-invalidation.test.js b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js index 5ec688a91ba1..abc8ea839370 100644 --- a/packages/astro/test/experimental-content-collections-cache-invalidation.test.js +++ b/packages/astro/test/experimental-content-collections-cache-invalidation.test.js @@ -1,8 +1,8 @@ import assert from 'node:assert/strict'; -import { after, before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; import fs from 'node:fs'; +import { after, before, describe, it } from 'node:test'; import { copyFiles } from '../dist/core/build/static-build.js'; +import { loadFixture } from './test-utils.js'; describe('Experimental Content Collections cache - invalidation', () => { class CacheBackup { @@ -32,27 +32,29 @@ describe('Experimental Content Collections cache - invalidation', () => { hooks: { 'astro:build:done': ({ cacheManifest }) => { this.used = cacheManifest; - } - } - } + }, + }, + }; } } describe('manifest version', () => { - let fixture, backup, - /** @type {ManifestTestPlugin} */ - testPlugin; + let fixture, + backup, + /** @type {ManifestTestPlugin} */ + testPlugin; before(async () => { testPlugin = new ManifestTestPlugin(); fixture = await loadFixture({ root: './fixtures/content-collections-cache-invalidation/', cacheDir: './cache/version-mismatch/', experimental: { contentCollectionCache: true }, - integrations: [ - testPlugin.plugin() - ] + integrations: [testPlugin.plugin()], }); - backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/version-mismatch/'); + backup = new CacheBackup( + './fixtures/content-collections-cache-invalidation/', + './cache/version-mismatch/' + ); backup.backup(); await fixture.build(); }); @@ -68,20 +70,22 @@ describe('Experimental Content Collections cache - invalidation', () => { }); describe('lockfiles', () => { - let fixture, backup, - /** @type {ManifestTestPlugin} */ - testPlugin; + let fixture, + backup, + /** @type {ManifestTestPlugin} */ + testPlugin; before(async () => { testPlugin = new ManifestTestPlugin(); fixture = await loadFixture({ root: './fixtures/content-collections-cache-invalidation/', cacheDir: './cache/lockfile-mismatch/', experimental: { contentCollectionCache: true }, - integrations: [ - testPlugin.plugin() - ] + integrations: [testPlugin.plugin()], }); - backup = new CacheBackup('./fixtures/content-collections-cache-invalidation/', './cache/lockfile-mismatch/'); + backup = new CacheBackup( + './fixtures/content-collections-cache-invalidation/', + './cache/lockfile-mismatch/' + ); backup.backup(); await fixture.build(); }); From 4f58aeb13a877cb402a3ea97519d1e739c1f3076 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Thu, 18 Apr 2024 08:35:39 -0700 Subject: [PATCH 92/96] [ci] release (#10798) Co-authored-by: github-actions[bot] --- .changeset/few-pets-relax.md | 5 -- .changeset/itchy-donuts-destroy.md | 5 -- .changeset/late-bags-marry.md | 5 -- .changeset/lazy-rats-beam.md | 5 -- .changeset/metal-terms-push.md | 5 -- .changeset/yellow-fishes-occur.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 4 +- examples/component/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-lit/package.json | 2 +- examples/framework-multiple/package.json | 2 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 2 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 2 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/middleware/package.json | 2 +- examples/minimal/package.json | 2 +- examples/non-html-pages/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/view-transitions/package.json | 2 +- examples/with-markdoc/package.json | 2 +- examples/with-markdown-plugins/package.json | 2 +- examples/with-markdown-shiki/package.json | 2 +- examples/with-mdx/package.json | 2 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 2 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 12 +++++ packages/astro/package.json | 2 +- packages/db/CHANGELOG.md | 6 +++ packages/db/package.json | 2 +- packages/integrations/sitemap/CHANGELOG.md | 6 +++ packages/integrations/sitemap/package.json | 2 +- pnpm-lock.yaml | 56 ++++++++++----------- 40 files changed, 83 insertions(+), 89 deletions(-) delete mode 100644 .changeset/few-pets-relax.md delete mode 100644 .changeset/itchy-donuts-destroy.md delete mode 100644 .changeset/late-bags-marry.md delete mode 100644 .changeset/lazy-rats-beam.md delete mode 100644 .changeset/metal-terms-push.md delete mode 100644 .changeset/yellow-fishes-occur.md diff --git a/.changeset/few-pets-relax.md b/.changeset/few-pets-relax.md deleted file mode 100644 index 7e2682c27470..000000000000 --- a/.changeset/few-pets-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/db": patch ---- - -Expose the Drizzle `alias` utility from `astro:db` to enable self-joins on a table. diff --git a/.changeset/itchy-donuts-destroy.md b/.changeset/itchy-donuts-destroy.md deleted file mode 100644 index 655b27a26565..000000000000 --- a/.changeset/itchy-donuts-destroy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. diff --git a/.changeset/late-bags-marry.md b/.changeset/late-bags-marry.md deleted file mode 100644 index af6b4ba3ef5b..000000000000 --- a/.changeset/late-bags-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/sitemap": patch ---- - -Fixes an issue where the root url does not follow the `trailingSlash` config option diff --git a/.changeset/lazy-rats-beam.md b/.changeset/lazy-rats-beam.md deleted file mode 100644 index 66acfe33f265..000000000000 --- a/.changeset/lazy-rats-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Improves performance for frequent use of small components. diff --git a/.changeset/metal-terms-push.md b/.changeset/metal-terms-push.md deleted file mode 100644 index d9cbf378b38a..000000000000 --- a/.changeset/metal-terms-push.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Invalidate CC cache manifest when lockfile or config changes diff --git a/.changeset/yellow-fishes-occur.md b/.changeset/yellow-fishes-occur.md deleted file mode 100644 index 028412e5fc64..000000000000 --- a/.changeset/yellow-fishes-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Update list of available integrations in the `astro add` CLI help. diff --git a/examples/basics/package.json b/examples/basics/package.json index 5c22341e6577..02522acb7a68 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index afadb4360f96..072a6a331779 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/mdx": "^2.3.1", "@astrojs/rss": "^4.0.5", - "@astrojs/sitemap": "^3.1.3", - "astro": "^4.6.2" + "@astrojs/sitemap": "^3.1.4", + "astro": "^4.6.3" } } diff --git a/examples/component/package.json b/examples/component/package.json index 352bccdfbfbf..bcfcb66ac8d8 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index 00708fe30465..f6639d87d714 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -14,6 +14,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.5", "alpinejs": "^3.13.3", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/framework-lit/package.json b/examples/framework-lit/package.json index 6243b58fa89d..3c70813b7588 100644 --- a/examples/framework-lit/package.json +++ b/examples/framework-lit/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/lit": "^4.0.1", "@webcomponents/template-shadowroot": "^0.2.1", - "astro": "^4.6.2", + "astro": "^4.6.3", "lit": "^3.1.2" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index dabc84475a35..b0fd48b55ba5 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -18,7 +18,7 @@ "@astrojs/vue": "^4.1.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.2", + "astro": "^4.6.3", "preact": "^10.19.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index 993a445a2b8b..657eaf8bb5aa 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@preact/signals": "^1.2.1", - "astro": "^4.6.2", + "astro": "^4.6.3", "preact": "^10.19.2" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index b0eb38cb6b31..b96a70e073f0 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -14,7 +14,7 @@ "@astrojs/react": "^3.3.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", - "astro": "^4.6.2", + "astro": "^4.6.3", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index e9709aec3530..410555d9f6bc 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/solid-js": "^4.1.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "solid-js": "^1.8.5" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index a3aef84631fb..9a37664b2ecb 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "svelte": "^4.2.5" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index c4877b256e22..b7a1e49e9959 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/vue": "^4.1.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "vue": "^3.3.8" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index 5314b60259cc..a7ea4297ae75 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index db0616460131..7121e8c347b5 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/middleware/package.json b/examples/middleware/package.json index 6c43007318d8..1d84d858045d 100644 --- a/examples/middleware/package.json +++ b/examples/middleware/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@astrojs/node": "^8.2.5", - "astro": "^4.6.2", + "astro": "^4.6.3", "html-minifier": "^4.0.0" }, "devDependencies": { diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 031742f2c721..8b3a8dfedbc4 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json index 777c3a6da422..884f8d7591af 100644 --- a/examples/non-html-pages/package.json +++ b/examples/non-html-pages/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index 3f03d77df483..3af8adde6a83 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index ba0c478bc0a0..8ebd90fd163b 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -14,7 +14,7 @@ "dependencies": { "@astrojs/node": "^8.2.5", "@astrojs/svelte": "^5.4.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "svelte": "^4.2.5" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index d6500f40680b..0778ec8f8820 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2", + "astro": "^4.6.3", "sass": "^1.69.5", "sharp": "^0.32.6" } diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json index 2ef6379f89f2..61865cdee016 100644 --- a/examples/view-transitions/package.json +++ b/examples/view-transitions/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@astrojs/tailwind": "^5.1.0", "@astrojs/node": "^8.2.5", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index b398a7ce4a64..085a5b1b9305 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -12,6 +12,6 @@ }, "dependencies": { "@astrojs/markdoc": "^0.10.0", - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json index 4c70d2970e14..095b2e5d69c2 100644 --- a/examples/with-markdown-plugins/package.json +++ b/examples/with-markdown-plugins/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/markdown-remark": "^5.1.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "hast-util-select": "^6.0.2", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json index 5e099595859c..e06edaee9fe8 100644 --- a/examples/with-markdown-shiki/package.json +++ b/examples/with-markdown-shiki/package.json @@ -11,6 +11,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.6.2" + "astro": "^4.6.3" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index 68d15e5ff4a7..056c1ad1aa7f 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/mdx": "^2.3.1", "@astrojs/preact": "^3.2.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "preact": "^10.19.2" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index c7194eef7a6d..4c3093f01df0 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/preact": "^3.2.0", "@nanostores/preact": "^0.5.0", - "astro": "^4.6.2", + "astro": "^4.6.3", "nanostores": "^0.9.5", "preact": "^10.19.2" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index e4bf87d3126c..b0322860f62f 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -14,7 +14,7 @@ "@astrojs/mdx": "^2.3.1", "@astrojs/tailwind": "^5.1.0", "@types/canvas-confetti": "^1.6.3", - "astro": "^4.6.2", + "astro": "^4.6.3", "autoprefixer": "^10.4.15", "canvas-confetti": "^1.9.1", "postcss": "^8.4.28", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 75bc03d3be53..34b915f6ae70 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -12,7 +12,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^4.6.2", + "astro": "^4.6.3", "vitest": "^1.3.1" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 3156fd3b9dcc..2cf022a65824 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,17 @@ # astro +## 4.6.3 + +### Patch Changes + +- [#10799](https://github.com/withastro/astro/pull/10799) [`dc74afca9f5eebc2d61331298d6ef187d92051e0`](https://github.com/withastro/astro/commit/dc74afca9f5eebc2d61331298d6ef187d92051e0) Thanks [@martrapp](https://github.com/martrapp)! - Fixes an issue with persisted non-text input fields that have the focus during view transition navigation. + +- [#10773](https://github.com/withastro/astro/pull/10773) [`35e43ecdaae7adc4b9a0b974192a033568cfb3f0`](https://github.com/withastro/astro/commit/35e43ecdaae7adc4b9a0b974192a033568cfb3f0) Thanks [@lilnasy](https://github.com/lilnasy)! - Improves performance for frequent use of small components. + +- [#10763](https://github.com/withastro/astro/pull/10763) [`63132771373ce1510be3e8814897accc0bf62ef8`](https://github.com/withastro/astro/commit/63132771373ce1510be3e8814897accc0bf62ef8) Thanks [@matthewp](https://github.com/matthewp)! - Invalidate CC cache manifest when lockfile or config changes + +- [#10811](https://github.com/withastro/astro/pull/10811) [`77822a822b04b5113726f713df104e8667333c59`](https://github.com/withastro/astro/commit/77822a822b04b5113726f713df104e8667333c59) Thanks [@AvinashReddy3108](https://github.com/AvinashReddy3108)! - Update list of available integrations in the `astro add` CLI help. + ## 4.6.2 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 5fee4830df43..116270bbb45c 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "4.6.2", + "version": "4.6.3", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md index e7087ef74c5b..b909fffe0aac 100644 --- a/packages/db/CHANGELOG.md +++ b/packages/db/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/db +## 0.10.5 + +### Patch Changes + +- [#10789](https://github.com/withastro/astro/pull/10789) [`d4c91cb10924a0627a9e9a80bc549b3c82d043e6`](https://github.com/withastro/astro/commit/d4c91cb10924a0627a9e9a80bc549b3c82d043e6) Thanks [@NickDubelman](https://github.com/NickDubelman)! - Expose the Drizzle `alias` utility from `astro:db` to enable self-joins on a table. + ## 0.10.4 ### Patch Changes diff --git a/packages/db/package.json b/packages/db/package.json index d4e56e19bf95..074fdcb81dd3 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/db", - "version": "0.10.4", + "version": "0.10.5", "description": "Add libSQL and Astro Studio support to your Astro site", "license": "MIT", "repository": { diff --git a/packages/integrations/sitemap/CHANGELOG.md b/packages/integrations/sitemap/CHANGELOG.md index 9df35d31f53f..3ed7fa219bd7 100644 --- a/packages/integrations/sitemap/CHANGELOG.md +++ b/packages/integrations/sitemap/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/sitemap +## 3.1.4 + +### Patch Changes + +- [#10772](https://github.com/withastro/astro/pull/10772) [`0e22462d1534afc8f7bb6782f86db680c7a5f245`](https://github.com/withastro/astro/commit/0e22462d1534afc8f7bb6782f86db680c7a5f245) Thanks [@gislerro](https://github.com/gislerro)! - Fixes an issue where the root url does not follow the `trailingSlash` config option + ## 3.1.3 ### Patch Changes diff --git a/packages/integrations/sitemap/package.json b/packages/integrations/sitemap/package.json index cdff0a8aab99..b9b6ed24fcea 100644 --- a/packages/integrations/sitemap/package.json +++ b/packages/integrations/sitemap/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/sitemap", "description": "Generate a sitemap for your Astro site", - "version": "3.1.3", + "version": "3.1.4", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12dceba0da69..337e93245c3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,7 +134,7 @@ importers: examples/basics: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/blog: @@ -146,16 +146,16 @@ importers: specifier: ^4.0.5 version: link:../../packages/astro-rss '@astrojs/sitemap': - specifier: ^3.1.3 + specifier: ^3.1.4 version: link:../../packages/integrations/sitemap astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/framework-alpine: @@ -170,7 +170,7 @@ importers: specifier: ^3.13.3 version: 3.13.8 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/framework-lit: @@ -182,7 +182,7 @@ importers: specifier: ^0.2.1 version: 0.2.1 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro lit: specifier: ^3.1.2 @@ -212,7 +212,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -242,7 +242,7 @@ importers: specifier: ^1.2.1 version: 1.2.1(preact@10.20.2) astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -260,7 +260,7 @@ importers: specifier: ^18.2.15 version: 18.2.25 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro react: specifier: ^18.2.0 @@ -275,7 +275,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/solid astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro solid-js: specifier: ^1.8.5 @@ -287,7 +287,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -299,7 +299,7 @@ importers: specifier: ^4.1.0 version: link:../../packages/integrations/vue astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro vue: specifier: ^3.3.8 @@ -311,13 +311,13 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/middleware: @@ -326,7 +326,7 @@ importers: specifier: ^8.2.5 version: link:../../packages/integrations/node astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro html-minifier: specifier: ^4.0.0 @@ -339,19 +339,19 @@ importers: examples/minimal: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/non-html-pages: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/ssr: @@ -363,7 +363,7 @@ importers: specifier: ^5.4.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro svelte: specifier: ^4.2.5 @@ -372,7 +372,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro sass: specifier: ^1.69.5 @@ -390,7 +390,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/integrations/tailwind astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/with-markdoc: @@ -399,7 +399,7 @@ importers: specifier: ^0.10.0 version: link:../../packages/integrations/markdoc astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/with-markdown-plugins: @@ -408,7 +408,7 @@ importers: specifier: ^5.1.0 version: link:../../packages/markdown/remark astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro hast-util-select: specifier: ^6.0.2 @@ -429,7 +429,7 @@ importers: examples/with-markdown-shiki: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro examples/with-mdx: @@ -441,7 +441,7 @@ importers: specifier: ^3.2.0 version: link:../../packages/integrations/preact astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro preact: specifier: ^10.19.2 @@ -456,7 +456,7 @@ importers: specifier: ^0.5.0 version: 0.5.1(nanostores@0.9.5)(preact@10.20.2) astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro nanostores: specifier: ^0.9.5 @@ -477,7 +477,7 @@ importers: specifier: ^1.6.3 version: 1.6.4 astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro autoprefixer: specifier: ^10.4.15 @@ -495,7 +495,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^4.6.2 + specifier: ^4.6.3 version: link:../../packages/astro vitest: specifier: ^1.3.1 From 542d07f9fa4b33d79169a350a71f9cd8fe8437f9 Mon Sep 17 00:00:00 2001 From: Damanjeet Singh <49544630+DamanjeetSingh1@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:32:17 +0530 Subject: [PATCH 93/96] fixed the path to checkout existing blog posts on the home page of the blog starter template (#10814) Currently the 4th point on home page says: "Check out the included blog posts in src/pages/blog/". It the path here should be "src/content/blog/". --- examples/blog/src/pages/index.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/blog/src/pages/index.astro b/examples/blog/src/pages/index.astro index 46975d8fbde4..31269efde09a 100644 --- a/examples/blog/src/pages/index.astro +++ b/examples/blog/src/pages/index.astro @@ -30,7 +30,7 @@ import { SITE_TITLE, SITE_DESCRIPTION } from '../consts';
  • Edit this page in src/pages/index.astro
  • Edit the site header items in src/components/Header.astro
  • Add your name to the footer in src/components/Footer.astro
  • -
  • Check out the included blog posts in src/pages/blog/
  • +
  • Check out the included blog posts in src/content/blog/
  • Customize the blog post page layout in src/layouts/BlogPost.astro
  • From b5f7e75d4cc7ec944b91f9e1ccbfab9b5f42c867 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:05:59 +0200 Subject: [PATCH 94/96] Update packages/astro/package.json --- packages/astro/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index 116270bbb45c..bba8211d7512 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -179,7 +179,7 @@ "zod-to-json-schema": "^3.22.4" }, "optionalDependencies": { - "sharp": "^0.33" + "sharp": "^0.33.3" }, "devDependencies": { "@astrojs/check": "^0.5.8", From bb7fc4fa3d0d7e5612f297cab2932a177ea1d568 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:07:23 +0200 Subject: [PATCH 95/96] Update pnpm-lock.yaml --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 337e93245c3f..747abd17927c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -694,7 +694,7 @@ importers: version: 3.22.5(zod@3.22.4) optionalDependencies: sharp: - specifier: ^0.33 + specifier: ^0.33.3 version: 0.33.3 devDependencies: '@astrojs/check': From a2317792661ce10fcf278cd433c651d1eda8d3d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Dr=C3=A4xler?= Date: Tue, 23 Apr 2024 16:59:21 +0000 Subject: [PATCH 96/96] update sharp version in examples/starlog and update pnpm-lock.yaml --- examples/starlog/package.json | 2 +- pnpm-lock.yaml | 519 ++++++++++++++++------------------ 2 files changed, 246 insertions(+), 275 deletions(-) diff --git a/examples/starlog/package.json b/examples/starlog/package.json index 0778ec8f8820..d4748ab6cec8 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -12,6 +12,6 @@ "dependencies": { "astro": "^4.6.3", "sass": "^1.69.5", - "sharp": "^0.32.6" + "sharp": "^0.33.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0d2eba476d5..7e64d429d468 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -378,8 +378,8 @@ importers: specifier: ^1.69.5 version: 1.75.0 sharp: - specifier: ^0.32.6 - version: 0.32.6 + specifier: ^0.33.3 + version: 0.33.3 examples/view-transitions: devDependencies: @@ -3070,7 +3070,7 @@ importers: version: link:../../.. lit: specifier: ^3.1.0 - version: 3.1.2 + version: 3.1.3 packages/astro/test/fixtures/markdown: dependencies: @@ -6804,6 +6804,14 @@ packages: /@emmetio/scanner@1.0.4: resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + /@emnapi/runtime@1.1.1: + resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + /@esbuild/aix-ppc64@0.20.2: resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -7058,6 +7066,194 @@ packages: engines: {node: '>=18.18'} dev: true + /@img/sharp-darwin-arm64@0.33.3: + resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.3: + resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.2: + resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.2: + resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.2: + resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.2: + resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.2: + resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.2: + resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.2: + resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.2: + resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.3: + resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.3: + resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.3: + resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.3: + resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.3: + resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.3: + resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.3: + resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.1.1 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.3: + resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.3: + resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -8604,6 +8800,16 @@ packages: estree-walker: 2.0.2 source-map-js: 1.2.0 + /@vue/compiler-core@3.4.24: + resolution: {integrity: sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==} + dependencies: + '@babel/parser': 7.24.4 + '@vue/shared': 3.4.24 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + dev: false + /@vue/compiler-dom@3.4.21: resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} dependencies: @@ -8617,6 +8823,13 @@ packages: '@vue/compiler-core': 3.4.23 '@vue/shared': 3.4.23 + /@vue/compiler-dom@3.4.24: + resolution: {integrity: sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==} + dependencies: + '@vue/compiler-core': 3.4.24 + '@vue/shared': 3.4.24 + dev: false + /@vue/compiler-sfc@3.4.21: resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} dependencies: @@ -8644,6 +8857,20 @@ packages: postcss: 8.4.38 source-map-js: 1.2.0 + /@vue/compiler-sfc@3.4.24: + resolution: {integrity: sha512-nRAlJUK02FTWfA2nuvNBAqsDZuERGFgxZ8sGH62XgFSvMxO2URblzulExsmj4gFZ8e+VAyDooU9oAoXfEDNxTA==} + dependencies: + '@babel/parser': 7.24.4 + '@vue/compiler-core': 3.4.24 + '@vue/compiler-dom': 3.4.24 + '@vue/compiler-ssr': 3.4.24 + '@vue/shared': 3.4.24 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + dev: false + /@vue/compiler-ssr@3.4.21: resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} dependencies: @@ -8657,6 +8884,13 @@ packages: '@vue/compiler-dom': 3.4.23 '@vue/shared': 3.4.23 + /@vue/compiler-ssr@3.4.24: + resolution: {integrity: sha512-ZsAtr4fhaUFnVcDqwW3bYCSDwq+9Gk69q2r/7dAHDrOMw41kylaMgOP4zRnn6GIEJkQznKgrMOGPMFnLB52RbQ==} + dependencies: + '@vue/compiler-dom': 3.4.24 + '@vue/shared': 3.4.24 + dev: false + /@vue/reactivity@3.1.5: resolution: {integrity: sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==} dependencies: @@ -8732,6 +8966,10 @@ packages: /@vue/shared@3.4.23: resolution: {integrity: sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==} + /@vue/shared@3.4.24: + resolution: {integrity: sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw==} + dev: false + /@webcomponents/template-shadowroot@0.2.1: resolution: {integrity: sha512-fXL/vIUakyZL62hyvUh+EMwbVoTc0hksublmRz6ai6et8znHkJa6gtqMUZo1oc7dIz46exHSIImml9QTdknMHg==} dev: false @@ -9067,11 +9305,6 @@ packages: dependencies: dequal: 2.0.3 - /b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - requiresBuild: true - dev: false - /babel-plugin-jsx-dom-expressions@0.37.19(@babel/core@7.24.4): resolution: {integrity: sha512-nef2eLpWBgFggwrYwN6O3dNKn3RnlX6n4DIamNEAeHwp03kVQUaKUiLaEPnHPJHwxie1KwPelyIY9QikU03vUA==} peerDependencies: @@ -9115,36 +9348,6 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /bare-events@2.2.2: - resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} - requiresBuild: true - dev: false - optional: true - - /bare-fs@2.2.3: - resolution: {integrity: sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==} - requiresBuild: true - dependencies: - bare-events: 2.2.2 - bare-path: 2.1.1 - streamx: 2.16.1 - dev: false - optional: true - - /bare-os@2.2.1: - resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==} - requiresBuild: true - dev: false - optional: true - - /bare-path@2.1.1: - resolution: {integrity: sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==} - requiresBuild: true - dependencies: - bare-os: 2.2.1 - dev: false - optional: true - /base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} dev: false @@ -9184,15 +9387,6 @@ packages: file-uri-to-path: 1.0.0 dev: false - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - requiresBuild: true - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - /body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -9479,11 +9673,6 @@ packages: optionalDependencies: fsevents: 2.3.3 - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - requiresBuild: true - dev: false - /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -9948,14 +10137,6 @@ packages: dependencies: character-entities: 2.0.2 - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - mimic-response: 3.1.0 - dev: false - /dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} dev: false @@ -9976,12 +10157,6 @@ packages: engines: {node: '>=6'} dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - requiresBuild: true - dev: false - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -10298,13 +10473,6 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - requiresBuild: true - dependencies: - once: 1.4.0 - dev: false - /enhanced-resolve@5.16.0: resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} @@ -10715,12 +10883,6 @@ packages: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - requiresBuild: true - dev: false - /express@4.19.2: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} @@ -10791,11 +10953,6 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - requiresBuild: true - dev: false - /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -10953,11 +11110,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - requiresBuild: true - dev: false - /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -11106,11 +11258,6 @@ packages: tar: 6.2.1 dev: false - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - requiresBuild: true - dev: false - /github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -11467,15 +11614,6 @@ packages: dependencies: '@types/hast': 3.0.4 - /hast-util-to-text@4.0.1: - resolution: {integrity: sha512-RHL7Vo2n06ZocCFWqmbyhZ1pCYX/mSKdywt9YD5U6Hquu5syV+dImCXFKLFt02JoK5QxkQFS0PoVdFdPXuPffQ==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - dev: true - /hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} dependencies: @@ -11483,7 +11621,6 @@ packages: '@types/unist': 3.0.2 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 - dev: false /hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -11699,11 +11836,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - requiresBuild: true - dev: false - /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false @@ -13079,12 +13211,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - requiresBuild: true - dev: false - /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -13169,11 +13295,6 @@ packages: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} dev: true - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - requiresBuild: true - dev: false - /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -13273,11 +13394,6 @@ packages: engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} dev: false - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - requiresBuild: true - dev: false - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -13306,19 +13422,6 @@ packages: tslib: 2.6.2 dev: false - /node-abi@3.57.0: - resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - semver: 7.6.0 - dev: false - - /node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - requiresBuild: true - dev: false - /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -14261,26 +14364,6 @@ packages: /preact@10.20.2: resolution: {integrity: sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==} - /prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true - requiresBuild: true - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.57.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false - /preferred-pm@3.1.3: resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} engines: {node: '>=10'} @@ -14381,14 +14464,6 @@ packages: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - requiresBuild: true - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -14408,11 +14483,6 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - requiresBuild: true - dev: false - /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -14438,17 +14508,6 @@ packages: unpipe: 1.0.0 dev: true - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - requiresBuild: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -14585,7 +14644,7 @@ packages: '@types/hast': 3.0.4 '@types/mathjax': 0.0.40 hast-util-from-dom: 5.0.0 - hast-util-to-text: 4.0.1 + hast-util-to-text: 4.0.2 jsdom: 23.2.0 mathjax-full: 3.2.2 unified: 11.0.4 @@ -15093,21 +15152,6 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - /sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - requiresBuild: true - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.0 - simple-get: 4.0.1 - tar-fs: 3.0.5 - tunnel-agent: 0.6.0 - dev: false - /sharp@0.33.3: resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -15137,7 +15181,6 @@ packages: '@img/sharp-win32-ia32': 0.33.3 '@img/sharp-win32-x64': 0.33.3 dev: false - optional: true /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -15214,20 +15257,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - requiresBuild: true - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - requiresBuild: true - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false - /simple-stack-form@0.1.12(astro@packages+astro)(zod@3.22.4): resolution: {integrity: sha512-cqxiA0/91WddM9Jya8Es1wfDurBfm8pUOmgMb08OB32wpmQLz2JQpjcarFNYkj5ZXfmE3qkGqakvx+6TCwxqUQ==} hasBin: true @@ -15411,16 +15440,6 @@ packages: mixme: 0.5.10 dev: true - /streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} - requiresBuild: true - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - optionalDependencies: - bare-events: 2.2.2 - dev: false - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -15525,6 +15544,7 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -15737,48 +15757,6 @@ packages: engines: {node: '>=6'} dev: false - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - requiresBuild: true - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-fs@3.0.5: - resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} - requiresBuild: true - dependencies: - pump: 3.0.0 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 2.2.3 - bare-path: 2.1.1 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - requiresBuild: true - dependencies: - b4a: 1.6.6 - fast-fifo: 1.3.2 - streamx: 2.16.1 - dev: false - /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -15982,13 +15960,6 @@ packages: yargs: 17.7.2 dev: true - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - requiresBuild: true - dependencies: - safe-buffer: 5.2.1 - dev: false - /turbo-darwin-64@1.13.2: resolution: {integrity: sha512-CCSuD8CfmtncpohCuIgq7eAzUas0IwSbHfI8/Q3vKObTdXyN8vAo01gwqXjDGpzG9bTEVedD0GmLbD23dR0MLA==} cpu: [x64] @@ -16482,7 +16453,7 @@ packages: vue: optional: true dependencies: - '@vue/compiler-sfc': 3.4.21 + '@vue/compiler-sfc': 3.4.24 svgo: 3.2.0 dev: false @@ -16580,7 +16551,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.9 + magic-string: 0.30.10 pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0